Начальное CV::MAT из массива с плавающей точкой, представляющего RGB-изображение

Введение в мою проблему:
Я сериализовал себя CV::MAT объект в C++ и отправлен в программу Python (точнее, у меня есть программа Python, которая использует C++ .exe в качестве подпроцесса..), я десериализовать его в Python обратно в 2D-массив (R,G,B) int

Теперь у меня есть другой метод в моем сервисе 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, как я хочу

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);
Другие вопросы по тегам