c++ - Opencv HoughLines 线西塔?

标签 c++ opencv lines hough-transform

我有一个关于 HoughLines 的 opencv 库的问题。以下格式来自官网:

C++: void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )

以及lines的输出数组参数的解释,它说:

lines – 线的输出 vector 。每条线由一个二元 vector 表示:rho 和 theta。垂直线的 theta 为 0,水平线的 pi/2(辐射率)。

请问theta的原理是什么?看起来theta在0~1.57之间(因为pi/2是1.57),但是我运行代码发现theta可以超过1.57变成一些奇怪的值,如下图,红线是检测到的HoughLines 的行,sita 是参数行中的值? enter image description here .

谁能告诉我线输出的theta有什么规律性?

非常感谢!

最佳答案

OpenCV 的文档、这个问题的另一个答案和维基百科(在撰写这个答案时)是错误的。这是我一生中第一次在维基百科中发现技术错误。

cv2.HoughLines 为您提供映射到线的对 (r, theta)。 Theta 是(图像的)x 轴和直线之间的逆时针角度。它介于零和 pi 之间。 Rho 是从图像左上角到直线的“距离”。正如 OP 指出的那样,rho 通常为负,因此距离不合适。以下是 OpenCV 作者的意思:

如果 theta < pi/2,我们谈论的是一条从图像左下角到右上角的直线。在这种情况下,它不能穿过 0 以下的 x 轴,并且我们确切地知道要绘制的线(给定 rho)。到目前为止,OpenCV 文档是正确的。

如果 theta > pi/2,那么我们需要消除与原点等距的两条平行线之间的歧义。为了解决这个问题,HoughLines 的作者制定了一个规则:如果 theta > pi/2,则通过图像左侧的线具有正 rho,而通过图像顶部的线具有负 rho。

关于c++ - Opencv HoughLines 线西塔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36052757/

相关文章:

c++ - 如何继承类型列表,然后调用继承成员列表中的成员?

c++ - 调用 Qt 的 setui 方法后是否应该检查空指针?

c++ - OpenCv 从连续数据数组创建 3 channel Mat

python - 如何生成带有 ids 偏移量的 charuco 板

java - 如何制作绘制线条的 Java 程序?

c++ - 在 SWIG 中包装 C++ 结构模板

c++ - 如何通过 QQmlListProperty 将列表模型分配给 QML ListView

java - Android OpenCV - CameraBridgeViewBase 拍照?

java - 如何测试这个程序

Python文件搜索行并在匹配后返回特定行数