在我的应用程序中,我想创建一个具有一些值的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
虽然你的答案对你的情况是正确的,但知道什么step和AUTO_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)
您可以轻松获得所需的结果,而无需定义其他变量"数据".
由于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 会抛出调试断言,因为您获得了错误的步骤参数.
| 归档时间: |
|
| 查看次数: |
83260 次 |
| 最近记录: |