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

Initial CV::MAT from a float array representing RGB image

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

的二维数组

现在我的 python 服务中有一个不同的方法,可以按需将这个 2D 数组发送回 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 才能存储 3 通道 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);