【问题标题】:Convert char array to Opencv Mat将 char 数组转换为 Opencv Mat
【发布时间】:2016-09-04 04:10:09
【问题描述】:

我已经定义了一个数组char buf[],需要把它转换成Opencv Mat。有什么办法吗?

char buf[Max_size];

【问题讨论】:

  • 如果你能提供一些细节会更好。你为什么要这个?数据是什么?您将在哪里使用输出 cv::Mat
  • 在我的服务器中,我从客户端接收以字节为单位的图像,并将它们存储在 char buf[] 数组中。然后我想发送 buf[] 由只接受 Mat 变量的函数 SURF 处理。在您提供的解决方案中,我是否必须将该行放在 for 循环中?
  • 不,你不需要把它放在一个循环中

标签: opencv char mat


【解决方案1】:

没有什么叫做:“将char数组转换为cv::Mat”。 cv::Mat 是一个容器,代表内存中的一个图像。它可能拥有数据,也可能不拥有。如果你想创建一个cv::Mat 来表示一个图像,它的位图数据在某个char 数组中,你可以使用下面的代码。这是假设您知道图像的行和列。

cv::Mat my_mat(rows,cols,CV_8UC1,&buf[0]); //in case of BGR image use CV_8UC3

请记住,在这种情况下,cv::Mat 不拥有数据的所有权。您已手动删除数据。不过因为是栈数组,所以什么都不需要。

【讨论】:

  • 对于其他任何使用谷歌搜索的人;如果您的数据是unsigned char*,则需要在构造函数调用中强制转换为void*,以便重载解析以找到正确的构造函数。
【解决方案2】:

我认为 Humams 的回答是正确的,但是,这里有一个完整的 C++ 示例,说明如何从无符号字符数组中获取图像。

    #include <opencv2/opencv.hpp>  

    unsigned char img_data[] = {
        // first row, 4 colored pixels
        0, 0, 0,
        255, 0, 0,
        0, 0, 0 ,
        0, 255, 0,

        // second row, 4 colored pixels
        0, 0, 255,
        0, 0, 0,
        255, 0, 255,
        0, 0, 0
    };

    // get a correct pointer to the data
    unsigned char * img_data_ptr = (unsigned char*) &img_data;

    cv::Mat img(2, 4, CV_8UC3, img_data_ptr);
    cv::cvtColor(img, img, cv::COLOR_BGR2RGB);
    cv::imwrite("/out/myimage.png", img);

示例在https://github.com/FilipSivak/opencv-minimal docker化

【讨论】:

    猜你喜欢
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2011-06-08
    • 2014-12-28
    • 2012-05-03
    相关资源
    最近更新 更多