霍夫圆检测

同样基于极坐标,通过投票决定,判断是否为圆形

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);

}

效果图:

猜你喜欢

转载自blog.csdn.net/shuiyihang0981/article/details/82961206