来自表示 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<uchar>(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的主要内容,如果未能解决你的问题,请参考以下文章