Opencv- findContours函数异常

使用的版本:

Opencv:3.4.12,release版本
VS:vs2013

示例程序如下:

void tempfunc(Mat img)
{
	double thr_v;
	if (img.depth() == CV_16U)
	{
		img.convertTo(img, CV_8U, 1.0 / 257);
	}
	Mat thr_m;
	 vector< vector<  Point>> contours;
	thr_v = cv::threshold(img, thr_m, 0, 255, cv::THRESH_BINARY_INV + cv::THRESH_OTSU);
	cv::findContours(thr_m, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
}

异常现象:

(1)在含有调用findContours语句的函数内,程序可正常运行,但是跳出该函数时,程序异常崩溃;
(2)如果将项目属性的优化设置为禁止,可以看到,程序异常时,停留在 deallocate处,推测是在释放findContours语句使用的vector< vector< Point>> contours变量时,出现异常。
(3)若将该变量设置为全局变量,则不出现异常(因为不涉及到内存释放)
(4)该项目是VS2013,如果使用VS2015,可以正常运行。

按网友提供的办法尝试解决:

(1)变量定义时,加修饰cv::vector和cv::Point,未解决。
(2)项目-属性-配置属性-C/C++代码生成-运行库,将其改为“多线程调试(/MTd),未解决。
(3)变量的定义修改为vector< Mat> contours;未解决(当找到的的轮廓较多时,仍旧异常)
(4)变量定义修改为vector< Mat> contours(100);未解决

网友的提醒:

(1)“contours变量的vector空间 是在 opencv的库里申请的, 而自动释放是在你的代码里。虽然都叫vector, 但只要它不是在一个电脑上编译的就会有区别”
(2)“只能说vector这种东西设计得和X一样,版本不一致就兼容不了。你的代码和opencv的库编译方式不一致,就导致使用vector的释放异常。只有把opencv的源码放在工程里编译使用,才能在C++里无障碍的使用findcontour。”

猜测:

使用的opencv在编译时,可能不是选择的VS2013环境,导致编译后的dll文件在vs2013里使用出错(可能是在vs2015下编译的,所以可以在vs2015中正常使用)。

解决办法:

因本项目使用的是VS2013环境,所以确保在编译opencv时选择的是vs2013环境,将编译后的opencv文件放入工程中,上述问题得以解决。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值