opencv2.4.9中HoughlinesP源码中的疑问解析!

相信大部分人都看过这篇文章:

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呢?

回想一下映射公式:

\rho =xcos\theta +ysin\theta

x和y都是正的,而sin和cos结果是正负的,因此申请空间的时候,应该是实际距离的2倍。这个2倍没毛病,那为啥不是对角线的长度,而是(width+height)?我也没弄明白,是不是为了整齐,方便后面计算地址的时候方便?还是因为width和height是未知的,并不知道xcos\theta +ysin\theta的最大值是多少,索性就两者相加,肯定超不过这个范围呢?

2 shift到底是干啥的?

,<<shift到底是干啥的?

从计算dy的时候发现:

dy0 = cvRound( b*(1 << shift)/fabs(a) );

这个应该是一种快速的计算小数的方法,精度是1/(2^16),这个就是b/a*(2^16),但是是在完全的整数情况下计算的,如果计算平台是DSP,支持硬件浮点运算的话,那就随意去计算这个dy dx了,小数就小数呗,反正都是一个指令周期,但是为了适应不同平台,采用纯整数计算的方法,达到高精度的计算,算是很巧妙的想法了!后面在搜索的时候,加完dy dx后,就又向右移动了16bit, 相当于是只截取整数部分,小数部分全部截断:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章