findcounters函数调试失败

findcounters函数可以进行轮廓检测,目前我需要提取火焰的形状,

这个函数在今年六月份的代码中是已经成功运行了的,但是九月份再用却无法运行,错误有:

一、abort() has been called

二、运行至该函数,程序直接终止,看不出详细报错

三、指针问题

这里贴出我原来的代码:

void DrawFire(Mat &inputImg, Mat foreImg)
{
	vector<vector<Point>> contours_set;//保存轮廓提取后的点集及拓扑关系  

	findContours(foreImg, contours_set, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);//函数的输入图像是2值单通道图像,用于检测膨胀后的图像白色的轮廓

	Mat result0;
	Scalar holeColor;
	Scalar externalColor;

	vector<vector<Point> >::iterator iter = contours_set.begin();//画出识别方框,使用迭代器遍历轮廓提取的contour_set
	for (; iter != contours_set.end(); )
	{
		Rect rect = boundingRect(*iter);
		float radius;
		Point2f center;
		minEnclosingCircle(*iter, center, radius);

		if (rect.area() > 0)//改成200有利于筛选
		{

			rectangle(inputImg, rect, Scalar(0, 255, 0));
			++iter;

		}
		else
		{
			iter = contours_set.erase(iter);
		}
	}
	//由于结果太小
	imshow("showFire", inputImg);
	waitKey(33);
}
实现对火焰轮廓的提取,拟合。

读过opencv里的demo,最终,通过将函数调用与demo里一致,实现了函数功能,但是之前的程序为什么不能运行并不清楚。

因此,把修改后的函数贴出。

void DrawFire(Mat &inputImg, Mat foreImg)
{
	vector<vector<Point>> contours_set;//保存轮廓提取后的点集及拓扑关系
	vector<Vec4i> hierarchy;
	findContours(foreImg, contours_set, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));//函数的输入图像是2值单通道图像,用于检测膨胀后的图像白色的轮廓
																									   //vector<vector<Point> >::iterator iter = contours_set.begin();//画出识别方框,使用迭代器遍历轮廓提取的contour_set
	vector<vector<Point> >poly(contours_set.size());
	//vector<vector<Point> >polyr(contours_set.size());
	//cout<< contours_set.size() <<endl;
	double maxarea = 0;// 一帧里只有一个最大
	int k = 0;
	Scalar color = Scalar(255, 0, 0);
	for (int i = 0; i < contours_set.size(); i++)
	{
		approxPolyDP(Mat(contours_set[i]), poly[i], 5, true);
		double tmparea = abs(contourArea(poly[i], true));
		if (tmparea>maxarea)
		{
			maxarea = tmparea;
			k = i;//记录下那个面积最大的轮廓序号
		}
		//cout<<k<<endl;
		//if (abs(contourArea(poly[i], true)) > 3000)//3000对于14视频效果比较好//如果改成只显示最大的轮廓则接下来的计算将更简便
		//{
		//drawContours(inputImg, poly, i, color, 1, 8, vector<Vec4i>(), 0, Point());
		//}
	}
	drawContours(inputImg, poly, k, color, 1, 8, vector<Vec4i>(), 0, Point());
	//Mat drawing = Mat::zeros(foreImg.size(), CV_8UC3);//使用MAT drawing可以存储
	//return drawing;//返回MAT便于每一个函数调用画轮廓指针。
	imshow("静态特征-RGB颜色识别结果", inputImg);
	waitKey(33);
}
首篇博客,欢迎指正。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值