我知道在内存中opencv将Mat对象表示为一个大数组。因此,如果我有3个尺寸为200x200的通道垫,那么在内存中它会将这个垫存储在3x200x200大小的数组中。或者更常见的是,内存中的任何Mat都将存储为channels*rows*cols
。我们可以得到这样的数组
double *array = (double)mat.data;
假设矩阵的类型为double
现在我的问题是如果我想在通道ch访问元素,行r和col c跟随有效索引
,那么索引此数组的方法是什么?array[ch*rows*cols + c * rows + r]
或
array[ch*rows*cols + r * cols + c]
此致 阿赫桑
答案 0 :(得分:4)
正如您在documentation上报告的数据布局中所看到的,您可以访问以下值:
for(int r=0; r<rows; ++r){
for(int c=0; c<cols; ++c){
for(int ch=0; ch<nchannels; ++ch){
double val = array[(nchannels*mat.step*r) + (nchannels*c) + ch];
}
}
}
答案 1 :(得分:1)
您可以像这样获取数组中的值:
double val = array+ (r*mat.step)+c*mat.channels()+ch;
答案 2 :(得分:0)
我发现其他答案有些令人困惑:levels(df$x)[df$x]
[1] "a" "b" "c"
是行的大小,以字节为单位,而不是以(double)元素为单位,并且它已经考虑了通道数。要访问val,您应该使用:
mat.step
您可以验证此方法和其他方法与double* array = (double*) mat.data; // was (double) mat.data in the question
double value = array[ ((mat.step)/mat.elemSize1())*c+mat.channels()*r+ch]; // (mat.step)/mat.elemSize1() is the actual row length in (double) elements
运算符的比较,如下所示:
.at<>