【发布时间】:2020-09-12 10:41:51
【问题描述】:
我需要构建一个 (R,G,B) 像素的 3d 立方体,以使 R、G 和 B 的值等于它们在立方体中的索引。
例如,在 Cube[0,0,0] 我应该找到黑色的像素 (0,0,0),而在 Cube[255,255,255] 的像素值应该是 (255,255,255) 或白色。 在实践中,立方体应该以 8 位存储所有可能的颜色。
为了实现这一点,我看到 Armadillo 库具有 field 类型。
所以我认为将每个像素存储在 Col<size_t> 中并从中构建和填充 3D 字段是合理的,如下所示:
#include <armadillo>
typedef arma::Col<size_t> Pixel;
int nc = 256;
arma::field<Pixel> my_cube(nc, nc, nc);
for (size_t i = 0; i < nc; i++)
{
for (size_t j = 0; j < nc; j++)
{
for (size_t k = 0; k < nc; k++)
{
Pixel px = { i, j, k };
my_cube[i, j, k] = px;
my_cube[i, j, k].print(); // here I get the correct value for (i,j,k)
}
}
}
my_cube[0, 0, 0].print(); // here I get (255,255,0) instead of (0,0,0)
// If I try my_cube(0,0,0).print() or my_cube.at(0,0,0).print()
// I get the same wrong result for the (0,0,0) pixel and
// [matrix(0x1)] for different values of the indices.
但是,当我尝试在外循环之后访问一个元素时,我得到了错误的结果(参见上面的代码)。
有人可以解释这种行为吗?在 for 循环之后检索正确值时我缺少什么?
我本可以使用 OpenCV 轻松完成任务,但我正在编写的代码是我无法使用它的项目的一部分。
我正在使用 Armadillo 9.900 和 Visual Studio 2017。
【问题讨论】: