如何将C++数组转换为opencv Mat

mcE*_*nge 8 c++ opencv

将C++数组转换为2D opencv Mat对象的最快方法是什么?蛮力方法将循环遍历2D垫的所有条目并用数组的值填充它们.
有更好/更快的方法吗?我能以某种方式将数组的指针指向2D矩阵吗?
(我正在使用opencv 2.4.8)

api*_*i55 17

是的,在文档中cv::Mat你可以看到它是如何实现的.

特别是在这一行

C++:Mat :: Mat(int rows,int cols,int type,void*data,size_t step = AUTO_STEP)

这意味着你可以做类似的事情

double x[100][100];

cv::Mat A(100, 100, CV_64F, x);
Run Code Online (Sandbox Code Playgroud)

这不会将数据复制到它.您还必须记住OpenCV数据是行主要,这意味着它具有一行的所有列,然后是下一行,依此类推.所以你的数组必须匹配这种风格才能发挥作用.

关于速度有多快,文档还讨论了它:

data - 指向用户数据的指针.采用数据和步骤参数的矩阵构造函数不分配矩阵数据.相反,它们只是初始化指向指定数据的矩阵标头,这意味着不会复制任何数据.此操作非常有效,可用于使用OpenCV函数处理外部数据.外部数据不会自动解除分配,因此您应该对其进行处理.

它会工作得相当快,但是它是相同的数组,如果你在它之外修改它cv::Mat,它将被修改cv::Mat,如果它在任何点被销毁,那么它的data成员cv::Mat将指向一个不存在的地方.

更新:

我忘了也说,你可以创建cv::Mat和执行std :: memcpy.这样它将复制数据,这可能会更慢,但数据将由cv::Mat对象拥有并在驱逐舰上cv::Mat销毁.

double x[100][100];
cv::Mat A(100,100,CV_64F);
std::memcpy(A.data, x, 100*100*sizeof(double));
Run Code Online (Sandbox Code Playgroud)

  • “这不会将数据复制到其中”。这条线解决了我的崩溃...... (3认同)