VS2015中findContours的BUG

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

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

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值