我需要构建一个(R,G,B)像素的3d立方体,以便R,G和B的值等于它们在立方体中的索引。
例如,在Cube0,0,0处,我应该找到像素(0,0,0),它是黑色的,而在Cube255,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 Studio2017。
发布于 2020-09-13 05:54:48
operator[]仅适用于单个参数。因此,my_cube[i, j, k]是错误的。
您提到my_cube(0,0,0).print()或my_cube.at(0,0,0).print()也出现了同样的问题,但他们做的是正确的事情。但是,您还需要在赋值过程中使用它们中的任何一个。将my_cube[i, j, k] = px;更改为my_cube(i, j, k) = px;或my_cube.at(i, j, k) = px;,它将起作用。
https://stackoverflow.com/questions/63859473
复制相似问题