在我的应用程序中,我想创建一个具有一些值的OpenCV Mat A(二维),然后将其传递给另一个使用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);
在一维数组的情况下,传递的值是OK的。但这不适用于2D数组,这是更常见的情况。如何在OpenCV中解决此问题??
发布于 2012-08-27 17:41:04
最初,我使用了OpenCV在线指南中的助记符:
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
但是我不明白文档中的size_t step=AUTO_STEP
是什么意思。这意味着我可以省略OpenCV将自动选择AUTO_STEP
的step
参数
我试过了,这很管用:
A = Mat(2, 5, CV_32FC1, &data);
对于从数组初始化的2D Mat
发布于 2015-06-24 18:25:46
除了上面的答案,还有another option。
对于较小的数据,我更喜欢以下内容:
Mat A = (Mat_<float>(2, 5) << 1, 2, 3, 4, 5, 7, 8, 9, 10, 11);
你可以很容易地得到想要的结果,而不需要定义额外的变量'data‘。
发布于 2014-05-18 21:57:33
由于data
是二维数组-所有data
、&data
、*data
、data[0]
、&data[0]
和&data[0][0]
都指向数组的基址。可以选择上述表示形式中的任何一种来正确地构造Mat
,而不是
A = Mat(2, 5, CV_32FC1, X );
让您高枕无忧,因为OpenCV使用accepted作为void*
访问数据,而使用OpenCV访问数据就像使用line访问数据。我更喜欢使用相同的语法从一维数组或多维数组构造Mat。
A = Mat(1, 10, CV_32FC1, data ); //for 1D array
A = Mat(2, 5, CV_32FC1, data ); //for 2D array
返回到查询-请注意,即使从一维数组构造Mat
也是不正确的。步骤参数被提到为2。由于OpenCV overrides提供了步骤参数,如果行数为1,它恰好可以工作。对于更高维数的数组,OpenCV会针对错误的步骤参数抛出调试assertion,这是您得到的。
https://stackoverflow.com/questions/12139402
复制相似问题