相信大部分人都看過這篇文章:
Opencv2.4.9源碼分析——HoughLinesP :https://blog.csdn.net/zhaocj/article/details/40047397
趙老師分析的很詳細也很深入,但是對於初學者來說,還是有些死角沒覆蓋到。文章解答兩個問題:
1、rho的數量
numrho = cvRound(((width + height) * 2 + 1) / rho);
爲啥角度的個數就是 numangle = cvRound(CV_PI / theta);
而距離的個數就不能是圖像對角線的長度/rho呢?
回想一下映射公式:
x和y都是正的,而sin和cos結果是正負的,因此申請空間的時候,應該是實際距離的2倍。這個2倍沒毛病,那爲啥不是對角線的長度,而是(width+height)?我也沒弄明白,是不是爲了整齊,方便後面計算地址的時候方便?還是因爲width和height是未知的,並不知道的最大值是多少,索性就兩者相加,肯定超不過這個範圍呢?
2 shift到底是幹啥的?
,<<shift到底是幹啥的?
從計算dy的時候發現:
dy0 = cvRound( b*(1 << shift)/fabs(a) );
這個應該是一種快速的計算小數的方法,精度是1/(2^16),這個就是b/a*(2^16),但是是在完全的整數情況下計算的,如果計算平臺是DSP,支持硬件浮點運算的話,那就隨意去計算這個dy dx了,小數就小數唄,反正都是一個指令週期,但是爲了適應不同平臺,採用純整數計算的方法,達到高精度的計算,算是很巧妙的想法了!後面在搜索的時候,加完dy dx後,就又向右移動了16bit, 相當於是隻截取整數部分,小數部分全部截斷: