用霍夫圓檢測檢測圖像中的圓
霍夫圓檢測是opencv中用來檢測圓的重要算法,簡單的說,霍夫圓檢測就是對圖像中的弧線做切線,再在切點位置做切線的垂線,然後看這些垂線能交于一點的個數,這個在方法中是自己設定的。
HoughCircles(thresh, circles, HOUGH_GRADIENT, 1, 50, 100, 10, 20, 80);
參數:
thresh:輸入圖像的矩陣
Circles:傳回圓的資訊,包括圓的橫坐标,縱坐标,半徑
methed:CV_HOUGH_GRADIENT,2-1霍夫圓檢測
dp:計數器分辨率
minDist:圓心直接的最小距離,防止出現圓和圓相交。
Param1:Canny邊緣檢測的雙門檻值中的高門檻值,低門檻值預設為它的一半
Param2:最小投票數,基于圓心的投票數,也就是交線數量
minRadius:需要檢測圓的最小半徑,用來過濾掉一些太小的圓
maxRadius:需要檢測圓的最大半徑,過濾掉一些太大的圓
附C++代碼
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <vector>
using namespace std;
using namespace cv;
class CircleInfo;
int main()
{
//讀取圖像
Mat img = imread("D:\\code\\code\\0002\\yuan82.jpg");
Mat gray;
Mat thresh;
//轉成灰階
cvtColor(img, gray, COLOR_BGR2GRAY);
//二值化處理
threshold(gray, thresh, 100, 255, THRESH_BINARY);
vector<Vec3f> circles;
//霍夫圓檢測
HoughCircles(thresh, circles, HOUGH_GRADIENT, 1, 50, 100, 10, 20, 80);
}
附python代碼
import cv2
import numpy as np
img = cv2.imread('yuan88.jpg')
print(img.shape)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thresh,img1 = cv2.threshold(img, 90, 255, cv2.THRESH_BINARY)
circles = cv2.HoughCircles(img1,cv2.HOUGH_GRADIENT,1,50,param1=100,param2=20,minRadius=25 ,maxRadius=60)