霍夫變換圓形檢測


霍夫變換檢測圓的原理:

大家都知道三點可以確定一個圓,以這三點做所有半徑的圓則必有一個公共交點,這個交點為以三點為圓的圓心。

霍夫變換檢測圓形的原理跟檢測直線的原理是一樣的。圓的表達式為  (x-a)2+(y-b)2=r2 ,

把問題轉換成在求解經過像素點最多的 (a,b,r) 參數對。 

 

 

 

 

    常用檢測圓的方法:(本文用的不是該方法)

參考鏈接:https://www.cnblogs.com/lancer2015/p/6852488.html

                             https://blog.csdn.net/poem_qianmo/article/details/26977557

 

 

 

 

 

 

 代碼如下:

 

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    Mat src, dst;
    src = imread("L:/8.png");
    if (!src.data)
    {
        printf("could not load image...\n");
        return -1;
    }
    char INPUT_TITLE[] = "input image";
    char OUTPUT_TITLE[] = "hough circle demo";
    namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);
    namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);
    imshow(INPUT_TITLE, src);
    
    //中值濾波
    Mat moutput;
    //GaussianBlur(src, moutput,Size(5,5),0,0);
    medianBlur(src, moutput, 3);
    cvtColor(moutput, moutput, CV_BGR2GRAY);

    //霍夫圓檢測
    vector<Vec3f>pcircles;
    HoughCircles(moutput,pcircles, CV_HOUGH_GRADIENT, 1, 10, 100, 30, 5, 50);
    src.copyTo(dst);
    for (size_t i = 0; i < pcircles.size(); i++)
    {
        Vec3f cc = pcircles[i];
        circle(dst, Point(cc[0], cc[1]), cc[2], Scalar(0, 0, 255), 1.5, LINE_AA);  //畫圓形
//參數:1.要畫的圖像 2.圓心 3.半徑 4.顏色 5.線的粗細 6.線條類型 circle(dst, Point(cc[
0], cc[1]), 2, Scalar(0, 255, 0), 2, LINE_AA); //畫圓心 } imshow(OUTPUT_TITLE, dst); waitKey(0); return 0; }

 

實驗結果:

 

 

 

原圖                                                 檢測圖:

      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM