有谁知道 OpenCV 实现中概率霍夫变换的特定算法?我的意思是,是否有关于该算法的参考论文或文档?
为了得到这个想法,我当然可以查看源代码,但我想知道是否有任何关于它的文档。-- 它不在源代码的注释中(OpenCV 1.0)。
谢谢!
-斤
有谁知道 OpenCV 实现中概率霍夫变换的特定算法?我的意思是,是否有关于该算法的参考论文或文档?
为了得到这个想法,我当然可以查看源代码,但我想知道是否有任何关于它的文档。-- 它不在源代码的注释中(OpenCV 1.0)。
谢谢!
-斤
OpenCV 文档指出,该算法基于 J Matas 等人的“使用渐进概率霍夫变换对线条进行鲁棒检测”。这与维基百科上描述的 RHT 完全不同。
该论文似乎无法在 Internet 上免费获得,但您可以从 Elsevier 购买
OpenCV 2.4.4 中的源代码HoughLinesProbabilistic
包含解释所涉及的各个步骤的内联注释。
https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/hough.cpp
第 6 节中的文章Line Detection by Hough transformation可能很有用。
这是 Matas 等人的一篇相当简洁的论文。描述了该方法,正如其他人所提到的,它确实与随机霍夫变换完全不同:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.40.2186&rep=rep1&type=pdf
(虽然不确定这个链接的有效期有多长。它来自citeseer,不希望它明天就会消失,但谁知道......)
我快速查看了 hough.cpp 中的实现 icvHoughLinesProbabilistic(),因为我将使用它 :-) 它看起来相当简单,无论如何,我的主要兴趣是它是否最终会进行一些最小二乘线拟合 - 它没有,这很好。这只是意味着,如果希望获得准确的线段,可能需要使用 OpenCV 返回的起点/终点和隐含的线参数来从整个点集中选择相关点。我首先会使用一个相当保守的距离阈值,然后在这些点上以较小的阈值运行 RANSAC/MSAC。最后,像往常一样将一条线拟合到内部集,例如使用 OpenCV 的 cvFitLine()。
这是一篇关于随机霍夫变换的文章,我认为它与 OpenCV http://en.wikipedia.org/wiki/Randomized_Hough_Transform中使用的“概率霍夫变换”相同
基本上,您不会为所有点填充累加器,而是选择具有特定标准的一组点来填充霍夫变换。
结果是,有时,如果没有足够的起点,您可能会错过实际线路。如果你有一些线性结构,我想你会想要使用它,这样大多数点都是多余的。参考文献 2:L. Xu、E. Oja 和 P. Kultanan,“一种新的曲线检测方法:随机霍夫变换 (RHT)”,模式识别。莱特。11, 1990, 331-338。
我还阅读了一些非常不同的方法,其中算法将采用两个点并计算这两个点中间的点。如果该点是边缘点,那么我们将累积该线的 bin。这显然非常快,但你会假设一个有点非稀疏矩阵,因为如果没有足够的边缘点开始,你很容易错过线条。