Opencv在内存中的Mat表示

时间:2016-05-05 01:24:30

标签: c++ opencv

我知道在内存中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]

此致 阿赫桑

3 个答案:

答案 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<>