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

Posted

技术标签:

【中文标题】如何将 C++ 数组转换为 opencv Mat【英文标题】:How to convert C++ array to opencv Mat 【发布时间】:2017-06-09 08:37:11 【问题描述】:

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

【问题讨论】:

阅读OpenCV的文档!解释清楚了 另见:***.com/questions/12139402/… 【参考方案1】:

是的,在cv::Mat 的documentation 中,您可以看到它是如何实现的。

具体在这一行

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 数据是行主要的,这意味着它具有一行的所有列,然后是下一行,依此类推。所以你的数组必须匹配这种风格才能工作。

关于速度有多快,文档也有讲:

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));

【讨论】:

“这不会将数据复制到它”。这条线解决了我的崩溃...【参考方案2】:
#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;

【讨论】:

以上是关于如何将 C++ 数组转换为 opencv Mat的主要内容,如果未能解决你的问题,请参考以下文章

将 numpy 切片转换为 Opencv c++ Mat

如何在 C++ 中将 TF_Tensor 转换为 opencv Mat?

如何将 Opencv Mat 转换为 JPEG 字符数据

如何将opencv mat转换为字符串c ++

将 c++ opencv IplImage imageData 和 widthStep 转换为 android opencv Mat

将 OpenCV Mat 转换为数组(可能是 NSArray)