我有一条线, 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。

09-07 08:39