来自表示 RGB 图像的浮点数组的初始 CV::MAT

Posted

技术标签:

【中文标题】来自表示 RGB 图像的浮点数组的初始 CV::MAT【英文标题】:Initial CV::MAT from a float array representing RGB image 【发布时间】:2017-01-25 17:46:55 【问题描述】:

我的问题介绍: 我已经在 c++ 中序列化了自己的 CV::MAT 对象并发送到 python 程序(更准确地说,我有一个使用 c++ .exe 作为子进程的 python 程序..),我在 python 中将它反序列化回一个二维数组(R,G,B) 整数

现在我的 python 服务中有一个不同的方法,可以按需将这个二维数组发送回 c++ 进程并让它做一些事情 我不想使用 boost 序列化程序,因为它基本上是地狱 我自己从 python 序列化它并设法为 c++ 进程提供一个扁平数组以及二维数组的维度(行和列)

现在我不知道如何从这些数据中构造一个 CV::MAT 对象 我知道有 Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP) 可能会完成这项工作,但不知道如果它是我认为的那样,那么这一步会发生什么

任何帮助将不胜感激!

这是我目前的 c++ 代码

    vector<string> imgVector;
    int imgRows = stoi(kp.at(7));
    int imgCols = stoi(kp.at(8));
    split(kp.at(2), ' ', back_inserter(imgVector)); // kp.at(2) is a ' ' seperated array of integers
    int* pixels = (int*)malloc(sizeof(int) * imgVector.size());
    for (int j = 0; (unsigned)j < imgVector.size(); i++)
        pixels[j] = stoi(imgVector[j]);
    
    Mat image(imgRows, imgCols, CV_32F, pixels);

但我认为它会生成一个二维整数数组,而不是我想要的 RGB 元组

【问题讨论】:

您需要CV_8UC3 图像(不是 CV_32F)。缓冲区pixels 应该是uchar*,长度为rows*cols*3(3 个通道)。 我很困惑,如果像素是 uchar* 类型,那么它的长度怎么可能是 rows*cols*3?每个数字占用超过 1 个字节(即 uchar)。 是的,一个像素是一个三元组(3 个通道)BGR(在 OpenCV 中,约定是 BGR,而不是 RGB),其中每个通道在 [0,255] 范围内 uchar(stoi(...))。或者更好cv::saturate_cast&lt;uchar&gt;(stoi(...)) 和之前一样,输入 CV_32FC3,像素是 float* 的大小 (rows* cols* 3),stof(...)。对于单通道图像,CV_32FC1, size(rows*cols) 【参考方案1】:

更正的项目:

您需要类型为 CV_8UC3 才能存储 3 通道 int 数组。 垫子的大小应该是 rows*cols*3。 每个像素的数据类型应该是uchar

按照这些,下面的代码应该可以工作。

vector<string> imgVector;
int imgRows = stoi(kp.at(7));
int imgCols = stoi(kp.at(8));
split(kp.at(2), ' ', back_inserter(imgVector)); // kp.at(2) is a ' ' seperated array of integers
uchar* pixels = (uchar*)malloc(sizeof(uchar) * imgRows*imgCols*3);
for (int j = 0; (unsigned)j < imgVector.size(); i++)
    pixels[j] = uchar(stoi(imgVector[j]));

Mat image(imgRows, imgCols, CV_8UC3, pixels);

【讨论】:

Miki 已经通过 cmets 帮助了我,但这也是一个很好的答案,谢谢!

以上是关于来自表示 RGB 图像的浮点数组的初始 CV::MAT的主要内容,如果未能解决你的问题,请参考以下文章

视频防抖

如何知道 OpenCV 中的图像是不是为 RGB?

C: 将数组转换为 RGB 图像

激光雷达与应用

红绿灯检测应用

C++ RGB 图像数据叠加成二维数组(向量的向量)