注意
下面的解釋屬於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 檢測原理 兩點確定一條直線,通過一點可以確定無數...