OpenCV边界框
c++
image-processing
opencv
6
0

我正在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 。我还解决了其他一些小问题,但效果很好:

在此处输入图片说明

不知道我应该在这里写这个还是打开新线程....但是现在我需要一些有关组件标签和提取参数(例如中心点和面积)的帮助。 :)

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

看看我在这个问题上的其他答案 。编译该代码,并记住激活注释掉的代码。

结果

在此处输入图片说明

收藏
评论

当前,您在每个轮廓周围绘制一个边界框,findContour将在每个连接的白色或黑色组件周围找到一个轮廓,在您的图片中有很多轮廓。

因此,我要做的第一件事是对阈值图像进行一些形态学运算,以过滤掉所有噪声:进行一些打开和关闭操作 ,这两者都是扩张和腐蚀的组合。

在你的情况下像cvDilate(2次); cvErode(4次); cvDilate(2次)

这应将所有白色斑点合并为一个平滑斑点,但中间的黑洞将保留。您可以按尺寸找到合适的轮廓,但是使用CV_RETR_EXTERNAL而不是CV_RETR_TREE调用findContours比较容易,那么它将仅返回最外面的轮廓。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号