使用2D数组初始化OpenCV Mat

TSL*_*SL_ 26 opencv

在我的应用程序中,我想创建一个具有一些值的OpenCV Mat A(2-Dimensions),然后使用A作为输入将其传递给另一个OpenCV函数.

目前,我正在尝试:

// float data[2][5] = {{1,2,3,4,5},{7,8,9,10,11}}; 
// OR
float data[10] = {1,2,3,4,5,7,8,9,10,11};

// and then
//  A = Mat(1, 5, CV_32FC1, &data, 2);   // init from float 1D - array
// OR 
    A = Mat(2, 5, CV_32FC1, &data, 2);  
Run Code Online (Sandbox Code Playgroud)

在1D数组的情况下,传递的值是OK.但这对2D阵列不起作用,这更常见.我怎样才能在OpenCV中解决这个问题?

TSL*_*SL_ 30

或者,我使用了OpenCV在线指南中的助记符:

Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
Run Code Online (Sandbox Code Playgroud)

但我不明白文件的意思是"size_t step = AUTO_STEP".这意味着我可以省略'step'参数,OpenCV会自动选择AUTO_STEP

我尝试过这个有效:

A = Mat(2, 5, CV_32FC1, &data);
Run Code Online (Sandbox Code Playgroud)

对于从数组初始化的2D Mat


Sam*_*Sam 21

虽然你的答案对你的情况是正确的,但知道什么stepAUTO_STEP意思是很好的

通常,图像存储在连续的存储器块中.每行跟在前一行之后,因此您可以通过简单的指针访问数据

data = dataPtr[currentCol + width * currentRow];
Run Code Online (Sandbox Code Playgroud)

其中width是以字节为单位的行宽(不是以像素为单位!)

但情况并非总是如此 - 有时您访问子矩阵,并且数据在每一行都是连续的,但是要进入下一行,您必须跳过一个字节序列.

这是步骤(也称为步幅)的来源.它表示两个连续行之间的距离(以字节为单位).在连续矩阵中,它的值是sizeof(pixel)*rowWidth,但在特殊情况下它可能具有自定义值.当您将AUTO_STEP传递给Mat构造函数时,它知道数据是连续的并使用上面的公式计算步骤.所以现在,更正确的读取像素值的方法是

data = dataPtr[currentCol + step * currentRow];
Run Code Online (Sandbox Code Playgroud)

哪个适用于各种图像.

最后,但并非最不重要的是,不要忘记步骤是以字节为单位,而不是以像素为单位.因此,如果你有一个3通道uchar RGB图像,步骤将是3*number of pixels,如果你有一个3通道int图像,step = 3(channels)*(4=sizeof(int))*(number rows)


Ruc*_*hir 17

除了上述答案,还有另一种选择.

对于较小的数据,我更喜欢以下内容:

Mat A = (Mat_<float>(2, 5) << 1, 2, 3, 4, 5, 7, 8, 9, 10, 11);
Run Code Online (Sandbox Code Playgroud)

您可以轻松获得所需的结果,而无需定义其他变量"数据".


Kir*_*ran 9

由于data是2D阵列-所有的data,&data,*data,data[0],&data[0],和&data[0][0]指向阵列的基础.任何上述表示的可以被选择以正确构建Mat代替X

A = Mat(2, 5, CV_32FC1, X );
Run Code Online (Sandbox Code Playgroud)

由于OpenCV 接受数据,void*并且OpenCV的数据访问符合要求,因此可以放心.我更喜欢从单维或多维数组构造Mat的相同语法.

A = Mat(1, 10, CV_32FC1, data ); //for 1D array
A = Mat(2, 5, CV_32FC1, data ); //for 2D array
Run Code Online (Sandbox Code Playgroud)

回到查询 - 请注意,Mat即使从1D数组构建也不正确.如果行数为1,则OpenCV 会覆盖提供的步骤参数,因为OpenCV 抛出调试断言,因为您获得了错误的步骤参数.