Opencv 霍夫變換 直線

2021-08-28 13:38:40 字數 2128 閱讀 2456

注意

下面的解釋屬於bradski和kaehler 的「 學習opencv 」一書。

hough line變換是用於檢測直線的變換。

為了應用變換,首先需要邊緣檢測預處理。

如你所知,影象空間中的一行可以用兩個變數表示。例如:在笛卡爾座標系中:引數:(m,b);在極座標系中:引數:(r,θ)

對於hough 變換,我們將在極地系統中表達線條。因此,線性方程可以寫為:

排列術語:r=xcosθ+ysinθ

意思是每一對的 (rθ,θ)表示通過每一排的 (x0,y0)

我們只需考慮這樣的情況: r>0 和 0

三個曲線在乙個點(0.925,9.6)相交,這些座標是引數 ( θ,r) 或其中(x0,y0), (x1,y1) 和 (x2,y2) lay.

opencv實現了兩種hough線變換:

乙個。標準hough變換

灣 概率霍夫線變換

載入影象應用標準hough line變換或概率線變換。在兩個視窗中顯示原始影象和檢測到的線:

//#include "opencv2/imgcodecs.hpp"

//#include "opencv2/highgui.hpp"

//#include "opencv2/imgproc.hpp"

#include #include #include using namespace cv;

using namespace std;

mat src, cdst, dst;

int main(int argc, char** argv)

char input_title = "input image";

namedwindow(input_title, cv_window_autosize);

//imshow(input_title, src);

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

cvtcolor(dst, cdst, color_gray2bgr);

vectorlines;

houghlinesp(dst, lines, 1, cv_pi / 180.0, 10, 0, 0);

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

imshow(input_title, src);

imshow("detected lines", cdst);

waitkey(0);

return 0;

}

canny(src,dst,50,200,3);
首先,你應用變換:

vectorlines;

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

具有以下引數:

dst:邊緣檢測器的輸出。它應該是乙個灰度影象(儘管事實上它是二進位制的)

行:乙個向量,將儲存檢測到的行的引數(r,θ)

rho:引數的解析度(以畫素為單位)。我們使用1畫素。r

theta:以弧度表示的引數的解析度。我們使用1度(cv_pi / 180)θ

threshold:將「* detect *」一行的最小交點數

srn和stn:預設引數為零。 

然後通過繪製線條顯示結果。

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

效果圖如下:

opencv 霍夫變換 直線檢測

用來做直線檢測 前提條件是邊緣檢測已經完成,一般用canny來做。cv houghlinesp inputarray src,輸入影象,必須8 bit的灰度影象 outputarray lines,輸出的極座標來表示直線 double rho,生成極座標時候的畫素掃瞄步長,一般是1 double t...

OpenCV 霍夫變換直線檢測

霍夫直線檢測的基本原理在於利用點與線的對偶性。在直角座標系下,一條直線的方程可以用點斜式表示 但是這種表達方式無法表示斜率無窮大的情況 直線垂直於x軸 因此,轉化到極座標系下 可以變換為 其中,因此,在直角座標系下的乙個點 也就是說,直角座標系下的乙個點對應極座標系下的一條曲線。反過來也是成立的。霍...

opencv之霍夫變換直線檢測

霍夫變換之直線檢測 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 檢測原理 兩點確定一條直線,通過一點可以確定無數...