Изображение OpenCV cvtColor усечено

Я использую cvtColor для преобразования изображения из формата YUYV в RGB24. Вывод в порядке с точки зрения цвета, но половина изображения обрезана. Изображение 640x480 YUYV буфер изображения без каких-либо заголовков. Я использую следующий код:

 FILE* fd = fopen("imgdump", "r+b");

 char buffer[640*480*2]; // Each pixel takes two bytes in YUYV

 if (fd != NULL)
 {
     fread(buffer, sizeof(char), 640*480*2, fd);
     fclose(fd);
 }

 Mat s_sImageMat = Mat(640, 480, CV_8UC2);  
 Mat s_sConvertedImageMat;

 cout << "before conversion\n";
 s_sImageMat.data = (uchar*) buffer;
 cvtColor(s_sImageMat, s_sConvertedImageMat, CV_YUV2RGB_YUYV);
 cout << "after conversion\n";

 FILE* fw = fopen("converted", "w+b");

 if (fw != NULL)
 {
     fwrite((char*)s_sConvertedImageMat.data, sizeof(char), 640*480*2, fw);
     fclose(fw);
 }

Оригинал Конвертировано

Исходный файл: https://drive.google.com/file/d/0B0YG1rjiNkBUQ0ZuaWN6Y1E2LUU/view?usp=sharing

Дополнительная информация: я использую opencv 3.2.


person Daniyal Yasin    schedule 20.03.2017    source источник
comment
s_sImageMat.data = (uchar*) buffer; -- ага, ты меняешь буфер без ведома владельца, а старый сливаешь? Почему бы вам не использовать соответствующий cv::Mat конструктор вместо?   -  person Dan Mašek    schedule 20.03.2017
comment
Я знаю, что это не повлияет на преобразование, но это не оправдание для действий, вызывающих утечку памяти. Не привыкайте писать такой код.   -  person Dan Mašek    schedule 20.03.2017
comment
Во всяком случае, в коде, который вы показываете, отсутствует значительная часть кода. Не могли бы вы приложить полный MCVE вместе с входными данными, которые позволят нам воспроизвести эту проблему?   -  person Dan Mašek    schedule 20.03.2017
comment
Файл изображения и полный MCVE, данный сейчас.   -  person Daniyal Yasin    schedule 20.03.2017


Ответы (1)


Проблема, кажется, в следующей строке:

fwrite((char*)s_sConvertedImageMat.data, sizeof(char), 640*480*2, fw);

Для RGB24 это должно быть:

fwrite((char*)s_sConvertedImageMat.data, sizeof(char), 640*480*3, fw);

Каждый пиксель занимает 3 байта в RGB24.

person Hamza Shahid    schedule 21.03.2017
comment
Большое спасибо. Это сработало, это решило проблему. - person Daniyal Yasin; 21.03.2017