OpenCV C ++:如何查找图像中的所有圆圈

时间:2017-11-25 13:00:25

标签: c++ opencv

您好我正在尝试查找下图中的所有圆圈并确定缺陷。

这是我的代码:



static void findCircles2(const Mat& image)
{
	vector<Vec3f> circles;
	int thresh1 = 5;
    Mat pyr, timg, gray0(image.size(), CV_8U), gray;
    pyrDown(image, pyr, Size(image.cols/2, image.rows/2));
    pyrUp(pyr, timg, image.size());
	for( int c = 0; c < 3; c++ )
    {
        int ch[] = {c, 0};
        mixChannels(&timg, 1, &gray0, 1, ch, 1);
        Canny(gray0, gray, 0, thresh1, 5);
        //dilate(gray, gray, Mat(), Point(-1,-1));
        gray = gray0 >= (1)*255/N;
		gray = gray0 >= (2)*255/N;
		gray = gray0 >= (6)*255/N;
		namedWindow( "Hough Circle Transform Demo 1", CV_WINDOW_AUTOSIZE );
		imshow( "Hough Circle Transform Demo 1", gray );
		waitKey(0);

		HoughCircles( gray, circles, CV_HOUGH_GRADIENT, 1, gray.rows/8, 200, 100, 0, 0 );
		cout<<"size of circles: "<<circles.size()<<endl;
		for( size_t i = 0; i < circles.size(); i++ )
		{
			Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
			int radius = cvRound(circles[i][2]);
			circle( gray, center, 3, Scalar(0,255,0), -1, 8, 0 );
			circle( gray, center, radius, Scalar(0,0,255), 3, 8, 0 );
		}

  /// Show your results
		namedWindow( "Hough Circle Transform Demo 2", CV_WINDOW_AUTOSIZE );
		imshow( "Hough Circle Transform Demo 2", gray );

		 waitKey(0);

    }
}
&#13;
&#13;
&#13;

图片:

enter image description here

然而,代码无法找到任何东西,我玩了阈值但它没有帮助。请指教。

开发平台:VS2010,Opencv版本:2.4.10

1 个答案:

答案 0 :(得分:1)

因为圈子太小而不是standard,所以你不能在二进制图像上做HoughCircles

替代方法是findContours,然后按contourArea的值与minEnclosingCircle的值之间的比率过滤轮廓。

enter image description here

相关问题