我创建了一个类,它通过在1D数组中存储数据并重载() operator
来模仿3D bool数组。我已经尝试过我能找到和想到的每一种方法,例如,这段代码:
bool operator()(unsigned x, unsigned y, unsigned z) const { return _data[_zSize*_ySize*x + y*_ySize + z]; }
允许我访问我需要的每个元素(我知道(x,y,z)实际上在这里(z,y,x),但它不适合我),当我尝试迭代时遇到问题通过阵列。
考虑一个深度的3D数组:3,高度:4和宽度5,每个元素初始化为false。当我尝试反转数组中的所有值时(sx()
返回depth
,sy()
- height
,sz()
- width
)< / p>
for (unsigned i = 0; i < x.sx(); ++i)
for (unsigned j = 0; j < x.sy(); ++j)
for (unsigned k = 0; k < x.sz(); ++k)
x(i, j, k) = !x(i, j, k);
我得到以下结果(其余两个表面看起来相同):
11110
01110
01110
01111
因此,显然有些元素被访问并反转两次。当我尝试不同的索引数组方法时,模式会发生变化。有什么问题?
答案 0 :(得分:4)
正确的操作符是
ls -l
答案 1 :(得分:1)
让我给出一个步长的概括方法。 假设您有一个3D数组,并且在(z,y,x)
中进行访问通过这个索引,我假设,Matrix维度为 有z个平面,每个平面的大小为y,x,y宽度,y为高度。
我们首先需要可视化3D结构以及我们如何访问元素。
据说我们想要访问(3,4,1)
使用基于零的索引
这里我们z = 3,y = 4,x = 1,我们的所需平面是第4个平面,我们所需的行是第4个,必需元素是第1个。
因此转到所需平面:z *(平面尺寸)= z *(宽度*高度)
转到所需行,y * sizeo of Row = y *(height)//或y * row_bytes
要获得必需点,只需添加x * sizeof(一个点)//当每个点有3或4个值时,例如在Opencv 3通道数据中,特定于多通道数据。
因此,最终方程将是
考虑3个通道数据,即每个点uchar的值为3个值,
值= z *(宽*高)+ y *(高)+ x *(3 * sizeof(uchar))
因此,一旦获得值,就不会逐个提取每个像素值。
PS:3 * sizeof(uchar)是OpenCV中常用的Vec3b的替换版本,用于访问3 Channel uchar数据。