OpenCV學習18 霍夫變換檢測直線

2021-08-17 05:15:54 字數 2166 閱讀 4734

霍夫變換直線檢測

前提條件:邊緣檢測已經完成(單通道8位灰度影象,經過二值化變為黑白影象)

平面空間轉到極座標空間

通過上式子可以把畫素點轉化成極座標,如下圖所示。

上面的曲線相交與一點,說明了什麼資訊呢?說明這些畫素都在一條直線。

比如乙個影象有200個畫素,通過座標變換。那麼就可以得到200條曲線。相交點的對應橫座標角度就是直線在空間座標的角度。這就是霍夫變換的原理。

霍夫直線變換介紹:

變換到極座標中,從[0,360]空間,可以得到r的大小

屬於同一條直線上點在極座標空間(r,θ)必然在乙個點上有強的訊號出現,根據此反算到平面座標中可以得到直線上各點的畫素座標,從而得到直線。

相關api學習:

標準的霍夫變換 houghlines從平面座標轉換到霍夫空間,最終輸出(θ,r)表示極座標空間。

霍夫變換直線斜率概率 houghlinesp最終輸出直線的兩個點空間座標。

houghlines(

src,

dst,

double rho, //生成極座標時候的畫素掃瞄步長

double theta, 生成極座標時候的角度步長,一般取值cv_p/180

int threshold, 閾值,只有獲得足夠交點的極座標點才被看成是直線

double srn=0, 是否應用多尺度的霍夫變換,設定為0表示經典變換

double stn=0,

double min_theta=0,

double max_theta=cv_pi

);houghlines(

src,

dst,

double rho, //生成極座標時候的畫素掃瞄步長

double theta, 生成極座標時候的角度步長,一般取值cv_p/180

int threshold, 閾值,只有獲得足夠交點的極座標點才被看成是直線

double minlinelength = 0, 最小直線長度

double maxlinegap = 0 最大間隔畫素

);**:

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include

using

namespace cv;

using

namespace

std;

void help()

int main(int argc, char** argv)

mat dst, cdst;

canny(src, dst, 50, 200, 3);

cvtcolor(dst, cdst, cv_gray2bgr);

#if 0

vector

lines;

houghlines(dst, lines, 1, cv_pi/180, 100, 0, 0 );

for( size_t i = 0; i < lines.size(); i++ )

#else

vector

lines;

houghlinesp(dst, lines, 1, cv_pi/180, 90, 0,2 );

for( size_t i = 0; i < lines.size(); i++ )

#endif

imshow("detected lines", src);

waitkey();

return

0;}

效果:

opencv學習之路(18) 霍夫變換

在影象處理和計算機視覺領域中,如何從當前的影象中提取所需要的特徵資訊是影象識別的關鍵所在。在許多應用場合中需要快速準確地檢測出直線或者圓。其中一種非常有效的解決問題的方法是霍夫 hough 變換。以上原理部分,霍夫圓變換的基本原理和上面講的霍夫線變化大體上是很類似的,只是點對應的二維極徑極角空間被三...

Python的OpenCV霍夫變換圓形檢測

circles cv2.houghcircles image,method,dp,mindist circles param1 param2 minradius maxradius 引數說明 輸出 circles 找到的圓的輸出向量。每個向量被編碼為3元素的浮點向量 x,y,半徑 傳遞引數 imag...

OpenCV 霍夫線變換 霍夫圓變換

關於霍夫變換在官方文件opencv249裡的描述如下 api如下 void houghlines inputarray image,outputarray lines,double rho,double theta,int threshold,double srn 0,double stn 0 vo...