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

标签 python c++ arrays opencv mat

我的问题简介:
我在 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/

相关文章:

python - Django 在尝试通过 django-admin-tools 创建菜单时引发配置不当

python - 属性错误: 'Action' object has no attribute 'text1'

python - 有没有一种标准的方法来获取 python 中的用户配置目录

python - 在 Windows 上安装 pycurl 时,我得到 "Please specify --curl-dir=/path/to/built/libcurl"

c++ - 两个 TypeSets/Tuples 中的公共(public)类型

c++ - 优雅地尝试以特定方式执行各种功能

C++:包含类实例的 union 会调用错误的虚函数

C - 从函数返回数组

将三个数组复制到 C 中的 2 个暗数组

javascript - 使用 ForEach 和 2 个数组来创建一个新对象