捉虫记 | 发现OpenCV4.0中的一个BUG
微信公众号: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中输入如下几行代码:
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat image = Mat::zeros(512, 512, 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学堂】
长按或者扫码二维码即可关注