我的问题简介:
我在 C++ 中序列化了一个 CV::MAT
对象并发送到一个 Python 程序(更准确地说,我有一个使用 C++ .exe 作为子进程的 Python 程序),我反序列化它在 python 中返回到 (R,G,B) 整数的二维数组
现在我的 python 服务中有一个不同的方法,可以按需将这个 2D 数组发送回 c++ 进程并让它做一些事情 我不想使用 boost 序列化程序,因为它基本上是 hell 我自己从 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
才能存储 3 channel int 数组。 - 垫子的大小应为行*列*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);
关于python - 来自表示 RGB 图像的 float 组的初始 CV::MAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41858211/