Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV边界框 我在C++环境下使用OpenCV进行软件开发。strong>目标是检测拳击手套并在手套轮廓周围绘制边界框_C++_Opencv_Image Processing - Fatal编程技术网

OpenCV边界框 我在C++环境下使用OpenCV进行软件开发。strong>目标是检测拳击手套并在手套轮廓周围绘制边界框

OpenCV边界框 我在C++环境下使用OpenCV进行软件开发。strong>目标是检测拳击手套并在手套轮廓周围绘制边界框,c++,opencv,image-processing,C++,Opencv,Image Processing,我遇到的问题是,边界框不止一次被淹没,事实上绘制了多个框。在过去的几天里,我试图做的是以某种方式消除绘制框的数量,并且只绘制一个大的边界框 我正在研究一些技术来填充对象的整体,我相信这在这种情况下会很有帮助 下面我发布了用于实现图像中显示结果的代码: vector<vector<Point> > contours; vector<Vec4i> hierarchy; vector<Vec3f> vecCircles; v

我遇到的问题是,边界框不止一次被淹没,事实上绘制了多个框。在过去的几天里,我试图做的是以某种方式消除绘制框的数量,并且只绘制一个大的边界框

我正在研究一些技术来填充对象的整体,我相信这在这种情况下会很有帮助

下面我发布了用于实现图像中显示结果的代码:

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 );          
     }
矢量轮廓;
向量层次;
矢量圆;
向量::迭代器;
而(1)
{
垫架;
cap>>帧;//从相机获取新帧
/////////////////////
Mat-imgHSV;
CVT颜色(框架、imgHSV、CV_BGR2HSV);
////////////////////
把你弄清楚;
高斯模糊(imgHSV,模糊,大小(1,1),2.0,2.0);
////////////////////
垫子范围(u out);;
范围内(模糊、标量(100100100)、标量(120255255)、范围外);
////////////////////
查找对象(范围、轮廓、层次、CV树、CV链、近似、简单、点(0,0));
///将轮廓近似为多边形+获取边界矩形和圆
向量等高线_多边形(等高线.size());
向量boundRect(contours.size());
向量中心(courtos.size());
Vectoradius(courtous.size());
对于(int i=0;i

如果有人能提出一些建议或提供一些信息来源,我可以找到我的问题的答案

编辑(快速更新):

我设法将输出图像逐渐提高到一个安静的程度,我对结果感到满意。关键是在我的
findContours()
函数中使用了腐蚀和膨胀。我将
CV_RETR_树
更改为
CV_RETR_EXTERNAL
。我解决了一些其他小问题,但效果很好:


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

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

因此,我要做的第一件事是对阈值图像进行一些形态学操作来过滤所有的噪声:做一些,这两种操作都是图像的组合

在你的例子中,像CVDiplicate(2次);CVDecrease(4次);CVDiplicate(2次)

<>这应该把所有的白色斑点合并成一个光滑的斑点,但是中间的黑洞仍然存在。
您可以根据大小找到正确的轮廓,但是使用CV_RETR_EXTERNAL而不是CV_RETR_树调用findContours更容易,然后它将只返回最外层的轮廓。

在找到轮廓之前,您应该应用形态学过滤器,如and。之后,您可以通过计算其,来找到轮廓并忽略小轮廓r边界框的大小和高度。最后,您可以使用删除其他轮廓内的边界框。

正如b\m所述,您需要应用形态学操作。然后,我会做一些事情,例如查找图像中最大的轮廓,并仅围绕该轮廓绘制边界框。我创建了以下函数对于我的一个项目,如果用正确的方式,我认为会对你有所帮助

CvSeq* findLargestContour(CvSeq* contours){

  CvSeq* current_contour = contours;
  double largestArea = 0;
  CvSeq* largest_contour = NULL;

  // check we at least have some contours

  if (contours == NULL){return NULL;}

  while (current_contour != NULL){

      double area = fabs(cvContourArea(current_contour));

      if(area > largestArea){
          largestArea = area;
          largest_contour = current_contour;
      }

      current_contour = current_contour->h_next;
  }

  // return pointer to largest

  return largest_contour;

}
在本主题中,编译该代码并记住激活注释掉的代码

结果


当你说CVDiplate(2次);CVDecreate(4次);代码中的CVDiplate(2次)是谁的样子…?:Mat deplate;Mat元素(7,7,CV_8U,标量(1));CV::deplate(range_out,deplate,element,Point(-1,-1),2);Mat decreate;Mat元素2(7,7,CV_8U,Scalar(1));CV::decreate(deplate,decreate,element,element 2,Point(-1,-,-,--1),4);Mat deplicate2;Mat element3(7,7,CV_8U,Scalar(1));CV::deplicate(range_out,deplicate2,element3,Point(-1,-1),2);请随意投票选出对您有帮助的答案。