1. 程式人生 > >利用霍夫變換做直線檢測的原理及OpenCV程式碼實現

利用霍夫變換做直線檢測的原理及OpenCV程式碼實現

說白了,以直線檢測為例,霍夫變換實際上就是把使每個畫素座標點經過變換都變成都直線特質有貢獻的統一度量(這種度量以我目前的理解與笛卡爾(極坐系)並無區別,即極半徑和極角),並對轉換後的度量進行累計(可以理解為投票),當一個波峰出現時候,說明有直線存在。如果要了解更詳細的,大家還是參考上面那篇博文吧!

霍夫變換進行直線檢測分為兩種實現方式:標準霍夫變換和概率霍夫變換。標準霍夫變換在OpenCV中的實現函式是HoughLines,概率霍夫變標準在OpenCV中的實現函式是HoughLinesP。

標準霍夫變換本質上是把影象對映到它的引數空間上,它需要計算所有的M個邊緣點,這樣它的運算量和所需記憶體空間都會很大。如果在輸入影象中只是處理m(m<M)個邊緣點,則這m個邊緣點的選取是具有一定概率性的,因此該方法被稱為概率霍夫變換(Probabilistic Hough Transform)。

由於標準霍夫變換的運算量和所需記憶體空間會很大,所以這裡就分析和實現這種不經濟的演算法,直接看概率霍夫變換函式HoughLinesP吧!函式原型如下:

void HoughLinesP( InputArray image, OutputArray lines,double rho, double theta, int threshold,double minLineLength=0, double maxLineGap=0 );

image為輸入影象,要求是8位單通道影象
lines為輸出的直線向量,每條線用4個元素表示,即直線的兩個端點的4個座標值
rho和theta分別為距離和角度的解析度,我覺得可以理解為極坐系中r和θ的解析度
threshold

為閾值,它表示要判斷為一條直線所需的最少度量,顯然這個值越大,所判斷出的直線越少;這個值越小,所判斷出的直線越多。

minLineLength:根據threshold提取出的直線長短不一,這個引數以長度對這些直線作一次篩選,小於這個引數值的就被拋棄。顯然這個值越大,所判斷出的直線越少;這個值越小,所判斷出的直線越多。

maxLineGap:最大直線間隙,即如果有兩條線段在一條直線上,但它們之間因為有間隙,所以被認為是兩個線段,如果這個間隙大於該值,則被認為是兩條線段,否則是一條。顯然這個值越大,所判斷出的直線越少;這個值越小,所判斷出的直線越多(怎麼理解?值越小,那麼間隙值就越容易大於這個值啊)

下面給出使用HoughLinesP作直線檢測的原始碼

程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取
程式碼請加Q2034196302獲取

程式碼編號 0033