查看原文
其他

捉虫记 | 发现OpenCV4.0中的一个BUG

gloomyfish OpenCV学堂 2020-02-04

微信公众号:OpenCV学堂
关注获取更多计算机视觉与深度学习知识
觉得文章有用,请戳底部【好看】支持


01

起因

微信上有个OpenCV研习社的会员告诉运行模板匹配的代码会程序崩溃,无法执行,还给我发了截屏,我建议他先debug,过了一会儿他告诉我说:“发现imshow这句代码有问题”,我感觉很奇怪,就让他把整个工程文件都发我啦,我今天下午的时候打开看了一下他的代码,发现没有什么问题,我一运行的时候就得到下面的错误:

我也是很纳闷,但是我发现当我把其中imshow语句注释掉之后,程序就会一切正常。同时结合报错信息,我感觉好像OpenCV不支持浮点数Mat对象显示了,必须是字节类型的才可以,于是我就尝试通过convertTo把Mat类型从CV_32F 转换为CV_8U,然后再次运行程序,神奇的发现居然一切正常啦!到此我以为OpenCV4.0开始imshow不支持浮点数Mat对象显示了。

02

实锤


于是我就把上面的错误copy了一下,去OpenCV官方论坛里面去搜索一通,发现居然在2018年的十一月份,OpenCV4.0发布不久就有人遇到了这个问题,OpenCV社区很大方的承认说这个是一个bug,链接在这里:

http://answers.opencv.org/question/203649/imshow-cant-show-cv_32f-image/

截图在这里:

我还跑到OpenCV4.0官方的教程主页,发现它们的模板匹配结果Mat对象还是以浮点数类型显示,估计不少人都被带到沟里面去了…


03

复现与解决


复现OpenCV4.0的这个BUG,只需在VS2015/VS2017中输入如下几行代码:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
         Mat image = Mat::zeros(512512, CV_32FC3);
         imshow("image", image);
         waitKey(0);
         return 0;
}

然后运行就会得到最上面的错误…

解决就更简单啦,升级到OpenCV4.0.1即可,官方说在OpenCV4.0.1版本上fix啦!不想升级版本,在浮点数显示之前加上这句即可

image.convertTo(image, CV_8U, 255);
imshow("image", image);

 

一切OK啦!望各位周知!


求木之长者,必固其根本

欲流之远者,必浚其泉源



关注【OpenCV学堂】

长按或者扫码二维码即可关注

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存