内存中的Opencv Mat表示形式

Ahs*_*bal 5 c++ opencv

我知道在内存中opencv将Mat对象表示为一个大数组。因此,如果我有3个尺寸为200x200的垫子,则它将在内存中将该垫子存储在尺寸为3x200x200的数组中。或更笼统地说,内存中的任何Mat都将存储为channels*rows*cols。我们可以得到这样的数组

double *array = (double)mat.data;
Run Code Online (Sandbox Code Playgroud)

假设矩阵的类型为double

现在我的问题是,例如,如果我想访问通道ch,行r和col c的元素,该数组的索引方式是什么?

array[ch*rows*cols + c * rows + r]
Run Code Online (Sandbox Code Playgroud)

要么

array[ch*rows*cols + r * cols + c]
Run Code Online (Sandbox Code Playgroud)

问候阿山

Mik*_*iki 9

正如您在文档中报告的数据布局中所见,您可以访问以下值:

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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Rainning请参阅“Mat()”[构造函数](https://docs.opencv.org/master/d3/d63/classcv_1_1Mat.html#a51615ebf17a64c968df0bf49b4de6a3a)的可选“step”参数的解释:“_字节数每个矩阵行占用。该值应包括每行末尾的填充字节(如果有)。如果缺少该参数(设置为 AUTO_STEP ),则假定没有填充,实际步长计算为 cols*elemSize()。请参阅 Mat::elemSize._"。所以在这种情况下:“cols * sizeof(double)”(假设默认无填充)。 (2认同)