我有一条线, Angular 为205度,长度为77像素。 (通过sqrt(x ^ 2 + y ^ 2)找到)有点像这样。这些图像上的测量值不正确,仅用于显示我的意思。
我正在像这样执行houghlines2:
image.HoughLines2(storage, HoughLinesMethod.Probalistic, 2, Cv.PI / 90, 1, lineLength, 0);
我添加了一个for循环以确保检测到该行。当lineLength为44时,我终于使用houghlines2方法找到了该行-参见下图。
我怎么必须一直下降到44?我需要能够以“几乎”正确的长度找到它,+-10可以,但是-33太多。
我需要有关如何执行houghtransform的答案,而不是很多指向不同读数的链接。我已经阅读了很多页面,但是我无法理解。
最佳答案
让我尝试一下吧……今年夏天,我一直在C++中使用OpenCV的Hough Transform,而HOUGH_PROBABILISTIC
却从未真正获得良好的结果。
我有一个一般性的想法,为什么标准的Hough变换有时无法检测到行,并且可能会向您解释为什么这也行不通:
应用HoughLines2
方法时,必须指定rho和theta参数。现在,如果此参数设置不正确(例如,料仓分开太宽,theta太大),则可能会“遗漏”部分线。
你说你读了一些书,所以你知道一般的想法。现在,如果您尝试想象一条从(0, 0)
到(500, 1)
的行。如果您知道如何绘制数字直线,那么您通常会知道这类似于直线:一种是从(0, 0)
到(250, 0)
,另一种是从(250, 1)
到(500, 1)
。如果您的霍夫角现在很大(例如,大于该线所在的 Angular ),它将永远不会“捕获”所有相同点中的所有点,并且基本上将检测到两条长度为250的线。较小,但实际上很多。由于HOUGH_PROBABILISTIC
不仅需要像素落入相同的“bin”,而且还要求它们在原始图片中或多或少是连续的,因此可能会使此故事又增加一层复杂性。
如果您考虑仅检测线段,则可能适用的其他解释是,最小长度不是由实际像素数确定的,而是由最终在同一仓中的像素数确定的。现在,由于上述相同的原因,所有77个像素实际上可能不在仓中,因此很短。
当然,所有这些只是我认为可能导致问题的基本原理。希望能有所帮助。我的建议是:尝试使用“rho”和“theta”参数,否则,仅检测正常线条即可。这些方法在OpenCV中的实现要好于此版本的IMO。