霍夫變換圓檢測原理及 OpenCV API 應用
霍夫變換圓檢測原理及 OpenCV API 應用
1. 霍夫圓變換
霍夫圓檢測和霍夫直線檢測的原理類似。建議先理解霍夫直線檢測的原理,再來看霍夫圓檢測。
圓在極座標下的數學表示式如下:
{
x
=
a
+
r
⋅
c
o
s
θ
y
=
b
+
r
⋅
s
i
n
θ
\left\{ \begin{aligned} x = a + r\cdot cos\theta \\ y = b + r\cdot sin\theta \\ \end{aligned} \right.
{x=a+r⋅cosθy=b+r⋅sinθ
其中
a
,
b
a, b
a,b 是圓心的座標,
r
r
r 是半徑。上面的表示式如果轉換到霍夫空間(
a
b
r
abr
abr三維座標)上,一個點就可以表示一個圓。所以在abr組成的三維座標系中,一個點可以唯一確定一個圓。
{
a
=
x
−
r
⋅
c
o
s
θ
b
=
y
−
r
⋅
s
i
n
θ
r
=
r
\left\{ \begin{aligned} a = &x - r\cdot cos\theta \\ b = &y - r\cdot sin\theta \\ r = &r \end{aligned} \right.
⎩⎪⎨⎪⎧a=b=r=x−r⋅cosθy−r⋅sinθr
上面是標準霍夫圓變換的原理,和霍夫直線變換相比,最大的區別是霍夫空間變成了三維空間,這就給統計效率帶來了挑戰。2-1霍夫變換(21HT)是對標準霍夫變換的改進,把霍夫變換分為兩個階段,從而減小了霍夫空間的維數。第一階段用於檢測圓心,第二階段從圓心推匯出圓半徑。該演算法有一個不足之處就是由於圓半徑的檢測完全取決於圓心的檢測,因此如果圓心檢測出現偏差,那麼圓半徑的檢測肯定也是錯誤的。OpenCV 中的霍夫變換圓是基於 21HT 實現的。更多關於霍夫圓變換的原理介紹可以參考 霍夫圓變換。
2. OpenCV API
- C++:
void
HoughCircles
(InputArray image, OutputArray circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0 )
Para | Disc. |
---|---|
image | 輸入影像 ,必須是8位的單通道灰度影像 |
circles | 輸出結果,發現的圓資訊,也是向量陣列vector |
method | 目前只有 HOUGH_GRADIENT,通過梯度來尋找 |
dp | dp = 1:在原圖上尋找;dp = 2, 原圖寬高減半 |
mindist | 如果兩個圓的圓心距離小於 mindist 則認為是同一個圓 |
param1 | Canny 檢測時的 高閾值,低閾值是 param1 的一半 |
param2 | 中心點累加器閾值,小於該閾值的會被忽略 |
minradius,maxradius | 搜尋半徑範圍 |
3. OpenCV API 應用
由於 對噪聲比較敏感,所以一般需要先進行去噪操作,比如 GaussianBlur(), 或者 medianBlur 等。
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <math.h>
#include <vector>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat img, gray;
img = imread("D:\\Code\\test\\image\\c.jpg", 1); // color image
cvtColor(img, gray, COLOR_BGR2GRAY);
// smooth it, otherwise a lot of false circles may be detected
GaussianBlur(gray, gray, Size(9, 9), 2, 2);
vector<Vec3f> circles;
HoughCircles(gray, circles, HOUGH_GRADIENT, 2, gray.rows / 4, 200, 100);
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
// draw the circle center
circle(img, center, 3, Scalar(0, 255, 0), -1, 8, 0);
// draw the circle outline
circle(img, center, radius, Scalar(0, 0, 255), 3, 8, 0);
}
namedWindow("circles", 1);
imshow("circles", img);
waitKey(0);
return 0;
}
參考
相關文章
- 【OpenCV】影像變換(四-2)霍夫變換圓檢測OpenCV
- 霍夫變換檢測圓
- 霍夫檢測圓:霍夫梯度法梯度
- 【OpenCV】影像變換(四-1)-霍夫變換線段檢測OpenCV
- 計算機視覺 OpenCV Android | 基本特徵檢測之 霍夫圓檢計算機視覺OpenCVAndroid特徵
- OpenCvSharp手繪ROI區域+模板匹配+霍夫變換檢測圓的邊界OpenCV
- OpenCV-Python教程(9)(10)(11): 使用霍夫變換檢測直線 直方圖均衡化 輪廓檢測OpenCVPython直方圖
- 用霍夫變換&SCNN碼一個車道追蹤器CNN
- 【OpenCV】影像的變換(三)-Canny邊緣檢測OpenCV
- Qt5&OpenCV3.2 Canny邊緣檢測+Hough變換QTOpenCV
- 關於霍夫找圓演算法cvHoughCircles的引數演算法
- 主題:人臉檢測原理及示例(OpenCV+Python)OpenCVPython
- Opencv 用SVM訓練檢測器OpenCV
- 隱馬爾可夫模型及應用隱馬爾可夫模型
- 詳解 Hough 變換(基本原理與直線檢測)
- 10-入侵檢測技術原理與應用
- 最新微信域名檢測api介面的機制原理及對接方法API
- OpenCV 離散傅立葉變換OpenCV
- OpenCV檢測篇(一)——貓臉檢測OpenCV
- zookeeper原理及應用
- 移動應用隱私合規檢測簡介及目標檢測技術的應用
- opencv——自適應閾值Canny邊緣檢測OpenCV
- 霍夫斯坦德的國家文化模型(轉載)模型
- 【OpenCV】角點檢測:Harris角點及Shi-Tomasi角點檢測OpenCV
- 簡單前端——圓與圓碰撞檢測前端
- 霍爾感測器的工作原理、分類及應用
- opencv關鍵點檢測OpenCV
- xgboost原理及應用
- [轉]SSH原理及應用
- 網路地址轉換NAT原理及應用-連線跟蹤--埠轉換*******************
- 微信域名檢測原理及防封方案
- API介面:原理、設計與應用API
- 【OpenCV】影像變換(二)邊緣檢測:梯度運算元、Sobel運算元和Laplace運算元OpenCV梯度
- 【OpenCV-Python】:影像的傅立葉變換與逆傅立葉變換OpenCVPython
- 文字檢測模型EAST應用詳解 ckpt pb的tf載入,opencv載入模型ASTOpenCV
- opencv視訊人臉檢測OpenCV
- OpenCV 人臉檢測自學(3)OpenCV
- OpenGL模型檢視變換、投影變換、視口變換模型