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

fcy6dtqo  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(132)

将C++数组转换为2D opencv Mat对象的最快方法是什么?蛮力方法是循环遍历2D Mat的所有条目,并用数组的值填充它们。
有没有更好/更快的方法来做到这一点?我可以以某种方式只是给予指针的数组的二维矩阵?
(我使用的是OpenCV 2.4.8)

6ljaweal

6ljaweal1#

是的,在cv::Mat的文档中,你可以看到它是如何实现的。
特别是在这一行
C++:Mat::Mat(int rows,int number,int type,void* data,size_t step= int_STEP)
这意味着你可以做一些事情,比如

double x[100][100];

cv::Mat A(100, 100, CV_64F, x);

字符串
这不会将数据复制到它。你还必须记住OpenCV数据是行为主的,这意味着它有一行的所有列,然后是下一行等等。所以你的数组必须匹配这种风格才能工作。
关于它有多快,文档也谈到了它:

data-指向用户数据的指针。接受数据和步骤参数的矩阵构造函数不会分配矩阵数据。相反,它们只是初始化指向指定数据的矩阵头,这意味着不会复制任何数据。此操作非常高效,可用于使用OpenCV函数处理外部数据。外部数据不会自动释放,因此您应该小心处理。

它会工作得很快,但它是同一个数组,如果你在cv::Mat之外修改它,它将在cv::Mat中被修改,如果它在任何时候被销毁,cv::Matdata成员将指向一个不存在的地方。

更新:

我还忘了说,你可以创建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));

svgewumm

svgewumm2#

#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;
}

字符串

相关问题