将C ++数组转换为2D opencv Mat对象的最快方法是什么? 蛮力方法是遍历2D垫的所有条目并用数组的值填充它们 有更好/更快的方法吗? 我能以某种方式将数组的指针指向2D矩阵吗? (我使用的是opencv 2.4.8)
答案 0 :(得分:14)
是的,在cv::Mat
的{{3}}中,你可以看到它是如何实现的。
特别是在这一行
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);
这不会将数据复制到它。您还必须记住OpenCV数据是行主要,这意味着它具有一行的所有列,然后是下一行,依此类推。所以你的数组必须匹配这种风格才能发挥作用。
关于速度有多快,文档也谈到了它:
数据 - 指向用户数据的指针。采用数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化指向指定数据的矩阵标头,这意味着不会复制任何数据。此操作非常有效,可用于使用OpenCV函数处理外部数据。外部数据不会自动解除分配,因此您应该处理它。
它会很快运行,但它是同一个数组,如果你在cv::Mat
之外修改它,它将在cv::Mat
中被修改,如果它在任何时候被销毁, data
的{{1}}成员将指向一个不存在的地方。
<强>更新强>
我忘了也说,您可以创建cv::Mat
并执行documentation。这样它将复制数据,这可能会更慢,但数据将由cv::Mat
对象拥有,并在使用cv::Mat
驱逐舰时销毁。
cv::Mat
答案 1 :(得分:0)
#include <opencv2/opencv.hpp>
int main()
{
// First row contains 3 white pixels
// Second row contains 3 black pixels
uchar temp[2][3] = {{255, 255, 255}, {0, 0, 0}};
cv::Mat mat = cv::Mat(2, 3, CV_8UC1);
// The first element of temp decays to int* data.
// It means that mat.data tracks temp.
mat.data = temp[0];
// Change the upper left pixel to black from temp,
// the change affects mat.
temp[0][0] = uchar(0);
cv::namedWindow("title", cv::WINDOW_NORMAL);
cv::imshow("title", mat);
cv::waitKey();
return 0;
}