霍夫變換之直線檢測
x =ρ
cosθ
x=ρcos\theta
x=ρcosθy=
ρsin
θy=ρsin\theta
y=ρsinθρ2
=x2+
y2ρ^2=x^2+y^2
ρ2=x2+
y2 tan
θ=y/
x(x≠
0)tan\theta=y/x(x≠0)
tanθ=y
/x(x
=0
)檢測原理
兩點確定一條直線,通過一點可以確定無數條直線,極座標直線公式ρ=x
cosθ
+ysi
nθρ=xcos\theta+ysin\theta
ρ=xcos
θ+ys
inθ每個點通過角度取不同的值,都能在橫座標為角度值,縱座標為ρ值的座標系內確定一條曲線,只要角度值的精細度足夠。ρ代表直線到原點的距離。對每個畫素採取這樣的操作,將會得出很多這樣的曲線,這些曲線的交點證明,這些點所在的那個角度所通過的直線到原點距離相等,則證明這些點就在同一條直線上。從運算的複雜程度來看opencv
不可能採取那樣精細的角度範圍。但大致原理基本如此。
函式api(不常用)
void houghlines(inputarray image, outputarray lines, double rho, double theta, int threshold, double srn=0, double stn=0, double min_theta = 0, double max_theta = cv_pi )
函式引數
函式api(常用)
void houghlinesp(inputarray image, outputarray lines, double rho, double theta, int threshold, double minlinelength=0, double maxlinegap=0 )
引數介紹
#include #include #include #include cv::mat src;
cv::mat gray_src;
int cur_val=240;
int max_val=255;
void canny_demo(int ,void *);
int main(void)
void canny_demo(int ,void *)
{ cv::mat canny_dst;
//邊緣檢測 使用動態的邊緣檢測範圍 檢測尺寸為3 使用非精確的近似演算法
cv::canny(gray_src,canny_dst,cur_val,cur_val*2,3,false);
cv::imshow("邊緣檢測",canny_dst);
vectorplines; //定義直線向量容器 可以理解為陣列 儲存所有的直線概率點集合
//直線檢測 直線概率點 乙個畫素點為檢測的步進檢測步長 一度的檢測角度 低於10個的直線點集合過濾
cv::houghlinesp(canny_dst,plines,1,cv_pi/180.0,60,100,20);
cv::mat dst = cv::mat(canny_dst.size(),src.type());
//定義顏色
opencv 霍夫變換 直線檢測
用來做直線檢測 前提條件是邊緣檢測已經完成,一般用canny來做。cv houghlinesp inputarray src,輸入影象,必須8 bit的灰度影象 outputarray lines,輸出的極座標來表示直線 double rho,生成極座標時候的畫素掃瞄步長,一般是1 double t...
OpenCV 霍夫變換直線檢測
霍夫直線檢測的基本原理在於利用點與線的對偶性。在直角座標系下,一條直線的方程可以用點斜式表示 但是這種表達方式無法表示斜率無窮大的情況 直線垂直於x軸 因此,轉化到極座標系下 可以變換為 其中,因此,在直角座標系下的乙個點 也就是說,直角座標系下的乙個點對應極座標系下的一條曲線。反過來也是成立的。霍...
Opencv 霍夫變換 直線
注意 下面的解釋屬於bradski和kaehler 的 學習opencv 一書。hough line變換是用於檢測直線的變換。為了應用變換,首先需要邊緣檢測預處理。如你所知,影象空間中的一行可以用兩個變數表示。例如 在笛卡爾座標系中 引數 m,b 在極座標系中 引數 r,對於hough 變換,我們將...