Uchar 到 cv::Mat 的向量

Posted

技术标签:

【中文标题】Uchar 到 cv::Mat 的向量【英文标题】:Vector of Uchar to cv::Mat 【发布时间】:2015-11-30 14:37:15 【问题描述】:

我有一张图像,我将其放入 uchar 的向量中,我使用 open mpi 从处理器发送到处理器,但是我需要将 uchar 的向量放入 cv::Mat

有没有简单的方法可以做到这一点?

cv::Mat image_on_proc = newpopulation(cv::Rect(0, start, population.cols, rows_in_section));
    std::vector<byte> img = matToBytes(image_on_proc);

    std::vector<uchar> test;
    for(int i=0; i<image_on_proc.rows; i++)
    
      for(int j=0; j<image_on_proc.cols; j++)
      
    test.push_back(image_on_proc.at<uchar>(i,j));
      
    

    MPI_Barrier(MPI_COMM_WORLD);

    MPI_Send(&test[0],test.size()*sizeof(uchar), MPI_BYTE, 0, 99, MPI_COMM_WORLD);

上面显示了我如何将图像放入向量并发送它,有一个相应的recv并且它可以工作,但是我不知道如何将它变成一个图像。

【问题讨论】:

cv::Mat imgFromVector = cv::Mat(rows, cols, CV_8UC1, vector.data()).clone(); 如果不想复制数据,可以省略 .clone。 【参考方案1】:

您可以使用以下方法将Mat 存储到vector&lt;uchar&gt; 中:

Mat img = ...; // img must be CV_8UC1 in this example
vector<uchar> v(img.begin<uchar>(), img.end<uchar>());

然后返回Mat,使用:

Mat img2(img.rows, img.cols, img.type(), v.data());

请注意,这里不是复制值,而是为v 中的数据创建Mat 标头,因此img2 将反映对v 所做的任何更改。如果v 超出范围,则img2 变为无效。您可以简单地使用clone() 来复制数据,例如:

Mat img3 = Mat(img.rows, img.cols, img.type(), v.data()).clone();

【讨论】:

以上是关于Uchar 到 cv::Mat 的向量的主要内容,如果未能解决你的问题,请参考以下文章

向量的 OpenCV 向量到 cv::Mat

为啥将 cv::Mat 的一列复制到向量中失败?

试图将 cv::Mat 数据复制到 uchar *

如何在向量中找到相同的 cv::Mat<cv::Mat>

为未知大小的 cv::Mat 保留向量内存

需要一种更快的方法将 cv::Mat 转换为一维向量形式