opencv之霍夫變換直線檢測

2021-09-29 03:19:20 字數 1984 閱讀 8512

霍夫變換之直線檢測

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 變換,我們將...