利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解
為了更好地看懂本文,大家可以先看下我寫的另一篇博文,鏈接如下:
https://blog.csdn.net/wenhao_ir/article/details/51774444
OpenCV的霍夫變換線檢測函數HoughLines()是利用極坐標下的參數ρ和θ值來表示直線的,我們在實際應用中往往要根據直線的參數ρ和θ值來繪制出直線,那么怎么繪制呢?
在OpenCV中繪制直線的函數為函數line(),它的原型如下:
從這個原型中,我們可以看出,如果要使用這個函數繪制線條,那么需要知道線條的兩個端點,即參數中的pt1和pt2,所以問題就轉化為根據參數ρ和θ值計算要繪制直線的兩個端點。
在進行計算前,我們先要搞清楚利用函數HoughLines()得到的θ到底是哪個角的度數。
當直線為水平或垂直時θ的值分別為π/2(即90度)和0(即0度),這個在官方文檔中已經說得很清楚了。如下面的截圖所示:
至于其它的情況,我們用兩幅圖來試驗證一下就知道了。
情況一的圖片如下:
情況二的圖片如下:
檢測圖中兩條直線的代碼如下:
兩幅圖的檢測結果如下:
這里說明一下為什么檢測到多條直線,這是因為我們的直線是有寬度的,所以檢測到了多條。
從這個運行結果我們可以看出兩種情況下哪個角是θ。如下面兩幅圖所示:
情況二:
知道了哪個角是θ,我們再把其它已知量和待求點及一些輔助線標注在圖上,如下面兩幅圖所示:
圖中的r就是
由以上幾何關系并結合三角函數的和差公式:
不難得到在兩種情況下都有pt1的坐標為:
p t 1. x = x 0 ? L s i n ( θ ) = x 0 + ( ? L s i n ( θ ) ) pt1.x = x0-Lsin(θ)=x0+(-Lsin(θ)) pt1.x=x0?Lsin(θ)=x0+(?Lsin(θ))
p t 1. y = y 0 + L c o s ( θ ) pt1.y = y0+Lcos(θ) pt1.y=y0+Lcos(θ)
兩種情況下都有pt2的坐標為:
p t 2. x = x 0 + L s i n ( θ ) = x 0 ? ( ? L s i n ( θ ) ) pt2.x = x0+Lsin(θ)=x0-(-Lsin(θ)) pt2.x=x0+Lsin(θ)=x0?(?Lsin(θ))
p t 2. y = y 0 ? L c o s ( θ ) pt2.y = y0-Lcos(θ) pt2.y=y0?Lcos(θ)
其中
x 0 = ρ c o s ( θ ) x0=ρcos(θ) x0=ρcos(θ)
y 0 = ρ s i n ( θ ) y0=ρsin(θ) y0=ρsin(θ)
有了以上計算公式后,我們便可以根據得到的ρ和θ值計算出pt1和pt2的坐標,進而繪制出直線。
相關代碼如下:
很明顯,上面的代碼中,L值是需要我們根據圖像的大小和直線的大小來確定,并不是每一幅圖像或每一條直線都取1000。L是什么的長度,博主在上面的手繪圖中應該是已經標注得很清楚了。
最后,對這篇博文有不明白的可以加博主的微信/QQ 2487872782交流。
總結
以上是生活随笔為你收集整理的利用OpenCV的霍夫变换线检测函数HoughLines()得到直线的ρ和θ值后绘制直线的原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 企业申请外观专利的优势
- 下一篇: Cannot find class in