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

时间:2017-01-25 17:46:56

标签: python c++ arrays opencv mat

我的问题简介:
我用c ++编写了一个CV::MAT对象并发送到python程序(更确切地说,我有一个使用c ++ .exe作为子进程的python程序..),我在python中将它反序列化为2D (R,G,B)整数的数组

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

现在我不知道如何从这些数据中构造一个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元组

1 个答案:

答案 0 :(得分:1)

更正的项目:

  • 您需要使用CV_8UC3类型来存储3通道int数组。
  • 垫子的大小应为行* 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);