OpenCV边界框
我正在C ++环境中使用OpenCV开发软件。 目标是检测拳击手套并围绕手套轮廓绘制边框 。
我遇到的问题是边界框不止一次被淹没,实际上多个框被绘制。 过去几天我试图做的是以某种方式消除绘制的盒子的数量,并且只画出一个大的边框。
我正在研究一些技术来填充整个对象,我相信这对于这种情况非常有帮助。
下面我发布了用于实现图像中显示结果的代码:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
vector<Vec3f> vecCircles;
vector<Vec3f>::iterator itrCircles;
while(1)
{
Mat frame;
cap >> frame; // get a new frame from camera
/////////////////////
Mat imgHSV;
cvtColor( frame, imgHSV, CV_BGR2HSV );
////////////////////
Mat blur_out;
GaussianBlur(imgHSV, blur_out, Size(1,1),2.0,2.0);
////////////////////
Mat range_out;
inRange(blur_out, Scalar(100, 100, 100), Scalar(120, 255, 255), range_out);
////////////////////
findContours(range_out, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );
/// Approximate contours to polygons + get bounding rects and circles
vector<vector<Point> > contours_poly( contours.size() );
vector<Rect> boundRect( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
for( int i = 0; i < contours.size(); i++ )
{
approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
boundRect[i] = boundingRect( Mat(contours_poly[i]) );
}
/// Draw polygonal contour + bonding rects
Mat drawing = Mat::zeros( range_out.size(), CV_8UC3 );
for( int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar(255,0,255);
drawContours( drawing, contours_poly, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
}
如果任何人可以提出一些提示或提供一些信息来源,我可以找到我的问题的答案。
编辑 (快速更新):
我设法逐渐将输出图像逐渐提高到一个安静满意的程度。 关键是侵蚀和扩张的用法以及我的findContours()
函数。 我将CV_RETR_TREE
更改为CV_RETR_EXTERNAL
。 我还处理了一些其他小事,但结果很好:
不知道我是否应该在这里写或打开新的线程....但现在我需要一些帮助组件标签和提取参数,如中心点和面积。 :)
您目前在每个轮廓周围绘制边框,并且findContour将在每个连接的白色或黑色组件周围找到轮廓,其中图片中有很多部分。
所以我要做的第一件事是在阈值图像上对所有噪音进行一些形态学操作:做一些打开和关闭,这两者都是扩张和侵蚀的组合。
在你的情况下,像cvDilate(2次); cvErode(4次); cvDilate(2次)
这应该将所有的白色斑点合并为一个光滑的斑点,但中间的黑洞将保留。 您可以按大小找到合适的一个,但使用CV_RETR_EXTERNAL而不是CV_RETR_TREE调用findContours会更容易,那么它只会返回最外层的轮廓。
看看我在这个问题上的其他答案。 编译该代码并记住激活被注释掉的代码。
结果 :
在找到轮廓之前,您应该应用像侵蚀和扩张的形态过滤器。 之后,您可以通过计算其大小,或边界框的高度和边界来查找轮廓并忽略小轮廓。 最后,您可以使用层次结构消除那些位于其他等值线内的元素。
链接地址: http://www.djcxy.com/p/39505.html上一篇: OpenCV Bounding Box