同样基于极坐标,通过投票决定,判断是否为圆形
opencv中API:
CV_EXPORTS_W 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:用于存储类型是vector<Vec3f>****;存储着圆心X,Y,和半径R
method:方法,一般是梯度,CV_HOUGH_GRADIENT
dp:检测内侧圆心的累加器图像的分辨率于输入图像之比的倒数,如dp=1,累加器和输入图像具有相同的分辨率,如果dp=2,累计器便有输入图像一半那么大的宽度和高度,一般不需要改变就是1
minDist:表示两个圆之间圆心的最小距离
param1:默认值100,表示传递给canny边缘检测算子的高阈值,而低阈值为高阈值的一半
param2:默认值100,它表示在检测阶段圆心的累加器阈值,它越小,就越可以检测到更多根本不存在的圆,而它越大的话,能通过检测的圆就更加接近完美的圆形了//也就是越大越苛刻
minRadius:最小半径
maxRadius:最大半径
#include <iostream>
#include <opencv.hpp>
#include <vector>
using namespace cv;
using namespace std;
char name[]="output";
int my1_value=348;
int my1_maxvalue=350;
int my2_value=44;
int my2_maxvalue=250;
void param_1(int ,void *);
vector<Vec3f>pcircles;
Mat gray_src;
int main()
{
Mat src=imread("circle1.jpg");
namedWindow(name);
medianBlur(src,src,5);
cvtColor(src,gray_src,CV_RGB2GRAY);
imshow("gray",gray_src);
createTrackbar("param_1",name,&my1_value,my1_maxvalue,param_1);
createTrackbar("param_2",name,&my2_value,my2_maxvalue,param_1);
param_1(0,0);
waitKey(0);
return 0;
}
void param_1(int ,void *)
{
Mat temp;
HoughCircles(gray_src,pcircles,CV_HOUGH_GRADIENT,1,20,my1_value,my2_value);
cvtColor(gray_src,temp,CV_GRAY2BGR);
Scalar color=Scalar(0,0,255);
for(size_t i=0;i<pcircles.size();i++)
{
circle(temp,Point(pcircles[i][0],pcircles[i][1]),pcircles[i][2],color,2);
circle(temp,Point(pcircles[i][0],pcircles[i][1]),2,color,1);
}
imshow("output",temp);
imwrite("mark.jpg",temp);
}
效果图: