VS2015中findContours的BUG

来源:互联网 发布:oracle nvl函数 mysql 编辑:程序博客网 时间:2024/06/05 08:58

如果有以下问题之一的,我已经发现解决办法。

1,在DEBUG模式下使用findContours能正常运行,在release模式下出错或闪退

2,在其他版本中findContours能正常运行,在VS2015+OPENCV249中出错

3,findContours在主函数中调用没问题,但是放在另一个函数中,然后主函数再调用这个函数出错或闪退。(release模式下)


为了弄清该问题,我特意写了一段测试代码:运行环境是VS2015+opencv249

#include "opencv2/imgproc.hpp"#include "opencv2/highgui.hpp"using namespace cv;using namespace std;Mat contours(Mat img_gray) {Mat img_bin;//自适应二值化   threshold(img_gray, img_bin, 125, 255, THRESH_BINARY_INV|THRESH_OTSU);vector<vector<Point>> all_contours;//在这个位置return 可以正常往下走findContours(img_bin, all_contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE);//查找边缘轮廓提取return img_bin;//在findContours后面return  函数结束后直接就结束了整个程序}void main(){Mat original = imread("D:\\lena.jpg");namedWindow("My original");imshow("My original", original);cv::cvtColor(original, original, CV_RGB2GRAY);Mat aa = contours(original);namedWindow("My sFilter");imshow("My sFilter", aa);waitKey(0);}


这段代码在DEBUG模式下是没问题的,但是在RELEASE模式下闪退了,发现问题出在findContours这里,去掉findContours程序完全没问题,加上就闪退,原因是程序在执行了findContours函数后在调用findContours函数的方法结束时就over掉了整个程序,所以没有执行main函数中后面的语句就造成了闪退了。

查了很多资料,有说在RELEASE模式下要给变量初始化,这无法解决本问题;

有说是DLL或依赖库什么的没配置好的,还有什么改变MFC或运行库的,像这样的贴:http://blog.csdn.net/superdont/article/details/24933597  都解决不了问题

有说使用老版cvFindContours但是,老版就是没findContours好,不服

还有个老外也发现了同样的问题,帖子链接:http://stackoverflow.com/questions/32349157/returning-from-function-crashing-only-after-a-certain-point-in-the-code/32372910   盒盒,老外也是搞不定这个BUG啊。


搞了2天,最后发现这确确实实是findContours的一个BUG,我把属性中的平台工具集改成Visual Studio 2013 (v120) 问题成功解决。在RELEASE模式下成功运行。

这应该是opencv在VS2015中的一个BUG

2 0