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);
}
首篇博客,欢迎指正。