OpenCV cvtColor 图像被截断

Posted

技术标签:

【中文标题】OpenCV cvtColor 图像被截断【英文标题】:OpenCV cvtColor image truncated 【发布时间】:2017-03-20 02:25:32 【问题描述】:

我正在使用 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

【问题讨论】:

s_sImageMat.data = (uchar*) buffer; -- 哎呀,你在所有者不知情的情况下交换缓冲区,并泄漏旧缓冲区?为什么不改用合适的cv::Mat constructor? 我知道它不会对转换产生影响,但这不是做导致内存泄漏的事情的借口。不要养成这样写代码的习惯。 无论如何,您显示的代码似乎缺少重要部分。您能否附上完整的MCVE,以及允许我们重现此问题的输入? 现在给出图像文件和完整的 MCVE。 【参考方案1】:

问题似乎在以下行:

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

对于 RGB24,应该是:

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

RGB24 中每个像素为 3 个字节

【讨论】:

非常感谢。成功了,这解决了问题。

以上是关于OpenCV cvtColor 图像被截断的主要内容,如果未能解决你的问题,请参考以下文章

为啥一个带有图像的按钮会导致 titleLable 文本被截断?

上传到 Cloudinary 后图像被截断

SQL Server Compact 4.0 图像列被截断为 8000

Swift -Rich Notification 截断图像的顶部和底部

图像在所有 4 个面上都被截断

Pillow 返回错误:“IOError:图像文件被截断(6 个字节未处理)”