opencv_tutorial_code学习——findContours&drawContours&画最小包围矩形&画最小包围圆

tutorial_code\ShapeDescriptors\generalContours_demo1.cpp

步骤:

1、灰度化

2、滤波

3、二值化

4、画轮廓

findContours( threshold_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0) );

for( size_t i = 0; i< contours.size(); i++ )

{

Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );

drawContours( drawing, contours_poly, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point() );

}

5、画最小包围矩形和最小包围圆

第一步:

vector<vector<Point> > contours_poly( contours.size() );

vector<Rect> boundRect( contours.size() );

vector<Point2f>center( contours.size() );

vector<float>radius( contours.size() );

第二步:

  for( size_t i = 0; i < contours.size(); i++ )
  {
    approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
    boundRect[i] = boundingRect( Mat(contours_poly[i]) );
    minEnclosingCircle( contours_poly[i], center[i], radius[i] );
  }

第三步:

Mat drawing = Mat::zeros( threshold_output.size(), CV_8UC3 );

Mat drawing1 = Mat::zeros(threshold_output.size(), CV_8UC3);

Mat drawing2 = Mat::zeros(threshold_output.size(), CV_8UC3);


for( size_t i = 0; i< contours.size(); i++ )
  {
    Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
    rectangle( drawing1, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
    circle( drawing2, center[i], (int)radius[i], color, 2, 8, 0 );
  }


结果图像:

原图:

opencv_tutorial_code学习——findContours&drawContours&画最小包围矩形&画最小包围圆

轮廓图:

opencv_tutorial_code学习——findContours&drawContours&画最小包围矩形&画最小包围圆

最小包围矩形图:

opencv_tutorial_code学习——findContours&drawContours&画最小包围矩形&画最小包围圆

最小包围圆图:

opencv_tutorial_code学习——findContours&drawContours&画最小包围矩形&画最小包围圆