将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)
| 归档时间: |
|
| 查看次数: |
16588 次 |
| 最近记录: |