OpenCV入门:Hough霍夫变换-圆形选择(HoughCircles)

霍夫变换:圆形选择

#include  
#include 
#include 
#include  
#include 
#include 
#include 
using namespace cv;
using namespace std;
 
int main()
{
	Mat src, gray;
	src = imread("C:/Users/defaultuser0.DESKTOP-RNJTL1M/Desktop/OpenCV_Distinguish/DistinguishImages/11.jpg");
	if (!src.data)
		return -1;

	cvtColor(src, gray, CV_BGR2GRAY);
	
	Mat contours;
	Canny(gray, contours, 125, 350);
	threshold(contours, contours, 128, 255, THRESH_BINARY);

	//高斯模糊平滑  
	//GaussianBlur(gray, gray, Size(9, 9), 2, 2);
	imshow("contours", contours);
	vector circles;
	//霍夫变换  
	/*
		HoughCircles函数的原型为:
		void HoughCircles(InputArray image,OutputArray circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0,int maxRadius=0 )
		image为输入图像,要求是灰度图像
		circles为输出圆向量,每个向量包括三个浮点型的元素——圆心横坐标,圆心纵坐标和圆半径
		method为使用霍夫变换圆检测的算法,Opencv2.4.9只实现了2-1霍夫变换,它的参数是CV_HOUGH_GRADIENT
		dp为第一阶段所使用的霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半,以此类推
		minDist为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心
		param1、param2为阈值
		minRadius和maxRadius为所检测到的圆半径的最小值和最大值
	*/
	HoughCircles(contours, circles, CV_HOUGH_GRADIENT, 1, contours.rows / 5, 150, 70, 0, 0);

	//在原图中画出圆心和圆  
	for (size_t i = 0; i < circles.size(); i++)
	{
		//提取出圆心坐标  
		Point center(round(circles[i][0]), round(circles[i][1]));
		//提取出圆半径  
		int radius = round(circles[i][2]);
		//圆心  
		circle(src, center, 3, Scalar(0, 255, 0), -1, 4, 0);
		//圆  
		circle(src, center, radius, Scalar(0, 0, 255), 3, 4, 0);
	}

	namedWindow("Circle", CV_WINDOW_AUTOSIZE);
	imshow("Circle", src);

	waitKey(0);
	return 0;
}

效果图:

OpenCV入门:Hough霍夫变换-圆形选择(HoughCircles)_第1张图片

你可能感兴趣的:(学习OpenCV)