向各位老师请教opencv中findContours获取轮廓大小时,程序崩溃的问题

mrmuto2 2015-05-16 04:54:39

cv::Mat srcImg = cv::imread("../1.jpg", 0);
cv::Mat bwImg;
vector<vector<cv::Point>> contours ;

// 二值化图像
cv::threshold(srcImg, bwImg, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);

cv::imshow("binary image", bwImg);
cv::waitKey();

// 查找轮廓,对应连通域
cv::findContours(bwImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);

// 寻找最大连通域
double maxArea = 0;
vector<cv::Point> maxContour;
for(size_t i = 0; i < contours.size(); i++)
{
double area = cv::contourArea(contours[i]);
if (area > maxArea)
{
maxArea = area;
maxContour = contours[i];
}
}

// 将轮廓转为矩形框
cv::Rect maxRect = cv::boundingRect(maxContour);

// 显示连通域
cv::Mat result1, result2;

bwImg.copyTo(result1);
bwImg.copyTo(result2);

for (size_t i = 0; i < contours.size(); i++)
{
cv::Rect r = cv::boundingRect(contours[i]);
cv::rectangle(result1, r, cv::Scalar(255));
}
cv::imshow("all regions", result1) ;
cv::waitKey();

cv::rectangle(result2, maxRect, cv::Scalar(255));
cv::imshow("largest region", result2) ;
cv::waitKey();


debug的时候double area = cv::contourArea(contours[i]);这里就出错了,好像是内存问题,这是出错的
图片
我的是vs2013+opencv2.4.10
不知道为什么,我同学跑我的程序可以运行,但我就出这错,网上看了一下,也有人说过这种情况
...全文
15201 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
andylan_zy 2018-08-24
  • 打赏
  • 举报
回复
换个版本的opencv库,是cv的bug,我发现几种版本的cv库,在findContours写法都不一样,不然就崩了
倩雯Memory 2018-05-22
  • 打赏
  • 举报
回复
是findcounts接口的问题 我自己也出现这个问题 vs2015+cv3.4.1 x64 运行就没有问题了
Evinxu 2017-12-26
  • 打赏
  • 举报
回复
哪里的配置有问题?求说明。
Black__White 2017-11-18
  • 打赏
  • 举报
回复
应该是配置问题吧,不行的话,把debug模式设置为release模式
likuai5216 2017-05-28
  • 打赏
  • 举报
回复
修改成MTD后直接报错了
阿翔ax 2017-04-05
  • 打赏
  • 举报
回复
引用 14 楼 u012839428 的回复:
[quote=引用 13 楼 z914022466 的回复:] 如果你没有配置错误的话,那请把你的程序改为 vector<Mat> contours(100); Mat hierarchy;//这句写成Vector<Vec4i> hierarchy(100)也行 findContours( BW, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE ); 更多关于opencv中findContours导致crash 请参照: http://blog.csdn.net/z914022466/article/details/52710081
但是这样对原来的信息造成了破坏,你这样修改的话,原来保存的轮廓点信息就没有了。[/quote] 原来的怎么会没有呢?没有理解你说的
佼者无谓 2017-03-24
  • 打赏
  • 举报
回复
引用 13 楼 z914022466 的回复:
如果你没有配置错误的话,那请把你的程序改为 vector<Mat> contours(100); Mat hierarchy;//这句写成Vector<Vec4i> hierarchy(100)也行 findContours( BW, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE ); 更多关于opencv中findContours导致crash 请参照: http://blog.csdn.net/z914022466/article/details/52710081
但是这样对原来的信息造成了破坏,你这样修改的话,原来保存的轮廓点信息就没有了。
阿翔ax 2016-10-13
  • 打赏
  • 举报
回复
如果你没有配置错误的话,那请把你的程序改为 vector<Mat> contours(100); Mat hierarchy;//这句写成Vector<Vec4i> hierarchy(100)也行 findContours( BW, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE ); 更多关于opencv中findContours导致crash 请参照: http://blog.csdn.net/z914022466/article/details/52710081
佼者无谓 2016-08-12
  • 打赏
  • 举报
回复
引用 10 楼 lizq3531 的回复:
唉!我这边也出问题了,一些是显示触发一个断点!
请问下,你解决了这个问题么。
SLFlaverne 2016-07-26
  • 打赏
  • 举报
回复
请问大家最后是怎么解决的额,我也遇到同样的问题。
lizq3531 2016-06-26
  • 打赏
  • 举报
回复
唉!我这边也出问题了,一些是显示触发一个断点!
pzb19841116 2016-04-25
  • 打赏
  • 举报
回复
引用 3 楼 u010947001 的回复:
找到原因了,环境配置问题
怎么修改的,为什么不说明白?
pzb19841116 2016-04-25
  • 打赏
  • 举报
回复
引用 楼主 mrmuto2 的回复:

cv::Mat srcImg = cv::imread("../1.jpg", 0);
        cv::Mat bwImg;
	vector<vector<cv::Point>> contours ;  

	// 二值化图像
	cv::threshold(srcImg, bwImg, 0.0, 255.0, CV_THRESH_BINARY | CV_THRESH_OTSU);

	cv::imshow("binary image", bwImg);
	cv::waitKey();

	// 查找轮廓,对应连通域
	cv::findContours(bwImg,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);

	// 寻找最大连通域
	double maxArea = 0;
	vector<cv::Point> maxContour;
	for(size_t i = 0; i < contours.size(); i++)
	{
		double area = cv::contourArea(contours[i]);
		if (area > maxArea)
		{
			maxArea = area;
			maxContour = contours[i];
		}
	}

	// 将轮廓转为矩形框
	cv::Rect maxRect = cv::boundingRect(maxContour);

	// 显示连通域
	cv::Mat result1, result2;

	bwImg.copyTo(result1);
	bwImg.copyTo(result2);
	
	for (size_t i = 0; i < contours.size(); i++)
	{
		cv::Rect r = cv::boundingRect(contours[i]);
		cv::rectangle(result1, r, cv::Scalar(255));
	}
	cv::imshow("all regions", result1) ;
	cv::waitKey();

	cv::rectangle(result2, maxRect, cv::Scalar(255));
	cv::imshow("largest region", result2) ;
	cv::waitKey();
debug的时候double area = cv::contourArea(contours[i]);这里就出错了,好像是内存问题,这是出错的 图片 我的是vs2013+opencv2.4.10 不知道为什么,我同学跑我的程序可以运行,但我就出这错,网上看了一下,也有人说过这种情况
楼主结贴了,但是什么都没说清楚,到底怎么解决的啊?
freedom098 2016-03-10
  • 打赏
  • 举报
回复
同样出现这个问题,求教高手解答啊!qt环境下这个函数崩溃了,但是在vs控制台下运行得非常好!
  • 打赏
  • 举报
回复
MFC工程说的mdd改成mtd 可是我的Qt工程怎么配置
欧阳家的三毛 2015-09-14
  • 打赏
  • 举报
回复
楼主,我也遇到这个问题,怎么处理?
liu洵美 2015-07-14
  • 打赏
  • 举报
回复
楼主,麻烦告知一下原因,我也出现这个问题了
u010947001 2015-05-18
  • 打赏
  • 举报
回复
找到原因了,环境配置问题
Jackery_Shh 2015-05-16
  • 打赏
  • 举报
回复
重点关注follow一下for(size_t i = 0; i < contours.size(); i++)循环以及function contourArea(contours[i]) 进行了那些相关操作,来定位bug位置及原因;
Jackery_Shh 2015-05-16
  • 打赏
  • 举报
回复
对容器contours进行了非法操作,contourArea(contours[i])报错,这里应该是你对容器进行了越界操作,可以follow一下此处i的值与contours的size的值

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧