Opencv:对于非标准尺寸的图像,imdecode() 失败

Posted

技术标签:

【中文标题】Opencv:对于非标准尺寸的图像,imdecode() 失败【英文标题】:Opencv: imdecode() is failed for images with non standard sizes 【发布时间】:2016-11-22 10:11:39 【问题描述】:

我遇到了 cv::imdecode() 的一项功能 - 当我尝试加载非标准尺寸的图像时,我总是得到一个 NULL 缓冲区和 rows = 0 的图像。

例如,这是一个大小为 236x402 的 .jpg:

我的 C++ 代码:

FILE* pf = NULL;
pf = _wfopen(strFileName, L"r");
if (!pf)

    return false;

fread(pFileBuf, 1, nFileSize, pf);
fclose(pf);
cv::Mat matRaw = cv::Mat( 1, nFileSize, CV_8UC1, pFileBuf);
cv::Mat matImage = cv::imdecode(matRaw, CV_LOAD_IMAGE_COLOR);
delete [] pFileBuf;
SIZE size;
size.cx = matImage.cols;
size.cy = matImage.rows;

运行后 matImage.rows = 0 和 matImage.data = NULL。

但对于 1280x720 的 jpeg 图像,效果很好。

想法?

【问题讨论】:

您可以尝试使用包含“b”(二进制)的fopen 模式(L"rb")吗?如果只使用“r”,则默认模式取决于某个变量中的值,因此使用“b”打开图像文件更安全(不依赖于任何变量,我知道的所有图像文件都具有二进制结构)。 pFileBuf 的类型是什么? How to process a JPEG binary data in OpenCV?的可能重复 看看my answer中的“方法1” 对于 Ped7g,我更正了“rb”,问题就消失了。感谢您的帮助 【参考方案1】:

中的错误

pf = _wfopen(strFileName, L"r");

必须是

pf = _wfopen(strFileName, L"rb");

感谢帮助

【讨论】:

以上是关于Opencv:对于非标准尺寸的图像,imdecode() 失败的主要内容,如果未能解决你的问题,请参考以下文章

有没有使用 OpenCV 的 imdecode 的替代方法?太慢了

opencv python图片编码解码

OpenCV读写图像文件解析

在 OpenCV 中训练级联分类器的负样本图像尺寸?

PIL Image.open 和 cv2.imdecode 的区别

opencv中imdecode的几行代码备份