標籤:ble init idt 過程 ogr 表達 方向 需要 har
在本篇文章中,我們將一起學習opencv中霍夫變換相關的知識點,以及瞭解opencv中實現霍夫變換的HoughLines,HoughLinesP函數的使用方法,實現霍夫圓變換的HoughCircles函數的使用方法。
先嘗鮮一下其中一個樣本程式的運行:
一、引言
在影像處理和電腦視覺領域中,如何從當前的映像中提取所需要的特徵資訊是Image Recognition的關鍵所在。在許多應用場合中需要快速準確的檢測出直線或者圓。其中一種非常有效解決問題的方法是霍夫(Hough)變換,其為影像處理中從Image Recognition幾何形狀的基本方法之一,應用很廣泛,也有很多改進演算法。最基本的霍夫變換是從黑白映像中檢測直線(線段),這篇文章就將介紹opencv中霍夫變換的使用方法和相關知識。
二、霍夫變換概述
霍夫變換(Hough Transform)是影像處理中的一種特徵提取技術,該過程在一個參數空間通過計算累計結果的局部最大值得到一個符合特定形狀的集合作為霍夫變換結果。
霍夫變換於1962年由PaulHough首次提出,最初的Hough變換是設計用來檢測直線和曲線,起初的方法要求知道物體邊界線的解析方程,但不需要有關地區位置的先驗知識。這種方法的一個突出優點是分割結果的Robustness,即對資料的不完全或雜訊不是非常敏感。然而,要獲得描述邊界的解析表達常常是不可能的。
後於1972年由Richard Duda & Peter Hart推廣使用,經典霍夫變換用來檢測映像中的直線,後來霍夫變換擴充到任意形狀物體的識別,多為圓和橢圓。霍夫變換運用兩個座標空間之間的變換將在一個空間中具有相同形狀的曲線或直線映射到另一個座標空間的一個點上形成峰值,從而把檢測任意形狀的問題轉化為統計峰值問題。
霍夫變換在opencv中分為霍夫線變換和霍夫圓變換倆種,下面將分別進行介紹。
三、霍夫線變換 3.1 OpenCV中的霍夫線變換
我們知道,霍夫線變換是一種用來尋找直線的方法,在使用霍夫變換之前,首先要對映像進行邊緣檢測的處理,也即霍夫線變換的直接輸入只能是邊緣二值映像。
opencv支援三種不同的霍夫變線變換,分別是:標準霍夫變換(standard hough transform,SHT)和多尺度霍夫變換(Multi-Scale Hough Transform,MSHT),累計機率霍夫變換(Progressive Probablilistic Hough Transform,PPHT)
其中,多尺度霍夫變換(MSHT)為經典霍夫變換(SHT)在多尺度下的一個變種。累計機率霍夫變換(PPHT)演算法是標準霍夫變換(SHT)演算法的一個改進。
它在一定的範圍內進行霍夫變換,計算單獨線段的方向以及範圍,從而減少計算量,縮短計算時間。之所以PPHT為“機率”的,是因為並不將累加器平面內的所有可能的點累加,而是累加其中的一部分,該想法是如果峰值足夠高,只用一小部分時間去尋找它就夠了。這樣猜想的話,可以實質性的減少計算時間。
在opencv中,我們可以用HoughLines函數來調用標準霍夫變換SHT和多尺度霍夫變換MSHT。
而HoughLinesP函數用於調用累計機率霍夫變換的PPHT。累計機率霍夫變換執行效率很高,所有相比於HoughLines函數,我們更傾向於使用HoughLinesP函數。
總結一下,OpenCV中的霍夫線變換有如下三種:
<1>標準霍夫變換(StandardHough Transform,SHT),由HoughLines函數調用。
<2>多尺度霍夫變換(Multi-ScaleHough Transform,MSHT),由HoughLines函數調用。
<3>累計機率霍夫變換(ProgressiveProbabilistic Hough Transform,PPHT),由HoughLinesP函數調用。
3.2 霍夫線變換的原理
【1】總所周知,一條直線在映像二維空間可由倆個變數表示,如:
(1)在笛卡爾座標系:可由參數:斜率和截距(m,b)表示
(2)在極座標系:可由參數:極徑和極角表示
對於霍夫變換,我們將採用第二種方式極座標系來表示直線,因此,直線的運算式可為:
化簡便可得到:
【2】一般來說對於點, 我們可以將通過這個點的一族直線統一定義為:
這就意味著每一對代表一條通過點的直線。
【3】如果對於一個給定點我們在極座標組極徑極角平面繪出所有通過它的直線, 將得到一條正弦曲線. 例如, 對於給定點X_0= 8 和Y_0= 6 我們可以繪出 (在平面):
只繪出滿足下列條件的點 和 .
【4】我們可以對映像中所有的點進行上述操作. 如果兩個不同點進行上述操作後得到的曲線在平面相交, 這就意味著它們通過同一條直線. 例如,接上面的例子我們繼續對點 和點 繪圖, 得到:
這三條曲線在平面相交於點 (0.925, 9.6), 座標表示的是參數對 或者是說點, 點和點組成的平面內的的直線。
【5】以上的說明表明,一般來說, 一條直線能夠通過在平面 尋找交於一點的曲線數量來檢測。而越多曲線交於一點也就意味著這個交點表示的直線由更多的點組成. 一般來說我們可以通過設定直線上點的閾值來定義多少條曲線交於一點我們才認為檢測到了一條直線。
【6】這就是霍夫線變換要做的. 它追蹤映像中每個點對應曲線間的交點. 如果交於一點的曲線的數量超過了閾值, 那麼可以認為這個交點所代表的參數對在原映像中為一條直線。
3.3 HoughLines( )函數詳解
此函數可以採用標準霍夫變換的二值映像線條。在opencv 中,我們可以用來調用標準霍夫變換SHT和多尺度霍夫變換MSHT的opencv內建演算法
1 void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 );
- 第一個參數,InputArray類型的image,輸入映像,即源映像,需為8位的單通道二進位映像,可以將任意的源圖載入進來後由函數修改成此格式後,再填在這裡。
- 第二個參數,InputArray類型的lines,經過調用HoughLines函數後儲存了霍夫線變換檢測到線條的輸出向量。每一條線由具有兩個元素的向量
表示,其中,是離座標原點((0,0)(也就是映像的左上方)的距離。 是弧度線條旋轉角度(0~垂直線,π/2~水平線)。
- 第三個參數,double類型的rho,以像素為單位的距離精度。另一種形容方式是直線搜尋時的進步尺寸的單位半徑。PS:Latex中/rho就表示 。
- 第四個參數,double類型的theta,以弧度為單位的角度精度。另一種形容方式是直線搜尋時的進步尺寸的單位角度。
- 第五個參數,int類型的threshold,累加平面的閾值參數,即識別某部分為圖中的一條直線時它在累加平面中必須達到的值。大於閾值threshold的線段才可以被檢測通過並返回到結果中。
- 第六個參數,double類型的srn,有預設值0。對於多尺度的霍夫變換,這是第三個參數進步尺寸rho的除數距離。粗略的累加器進步尺寸直接是第三個參數rho,而精確的累加器進步尺寸為rho/srn。
- 第七個參數,double類型的stn,有預設值0,對於多尺度霍夫變換,srn表示第四個參數進步尺寸的單位角度theta的除數距離。且如果srn和stn同時為0,就表示使用經典的霍夫變換。否則,這兩個參數應該都為正數。
在學完函數解析,看看淺墨為大家準備的以HoughLines為核心的樣本程式,就可以全方位瞭解HoughLines函數的使用方法了:
學習 opencv---(13)opencv霍夫變換:霍夫線變換,霍夫圓變換