如果有以下问题之一的,我已经发现解决办法。
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