Opencv HoughLines 线西塔?
Opencv HoughLines Lines Theta?
我有一个关于 HoughLines 的 opencv 库的问题。格式如下来自官网:
C++: void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )
以及lines输出数组参数的解释,是这样写的:
lines – 线的输出向量。每条线由一个二元向量表示:rho 和 theta。垂直线 theta 为 0,水平线(辐射度)为 pi/2。
请问theta的原理是什么?貌似theta在0~1.57之间(因为pi/2是1.57),但是我运行代码发现theta可以超过1.57变成一些奇怪的值,如下图,红线是HoughLines检测到的线,sita是参数lines中的值?
.
谁能告诉我线输出的 theta 的规律性是什么?
非常感谢!
我是这样理解的。我认为你的控制台应该显示的角度是橙色的(大约 -0.72 弧度)。但似乎 OpenCV 对所有平行线都使用正角。我的意思是你的控制台显示的紫色角度(大约 2.5 弧度)。所以你的线有这个 theta 和 rho (到线的距离)是负值。这是因为您的线位于原点的右侧。 (我是用Paint画的,不好看请见谅)
OpenCV 的文档、此问题的其他答案和维基百科(在撰写此答案时)是错误的。这是我一生中第一次在维基百科中发现技术错误。
cv2.HoughLines 为您提供映射到线的对 (r, theta)。 Theta 是(图像的)x 轴和直线之间的逆时针角度。它介于零和 pi 之间。 Rho是从图像左上角到直线的"distance"。正如 OP 指出的那样,rho 通常为负,因此距离不合适。以下是 OpenCV 作者的意思:
如果 theta < pi/2,我们谈论的是一条从图像左下角到右上角的直线。在这种情况下,它不能穿过 0 以下的 x 轴,并且我们确切地知道要绘制的线(给定 rho)。到目前为止,OpenCV 文档是正确的。
如果theta > pi/2,那么我们需要消除与原点等距的两条平行线之间的歧义。为了解决这个问题,HoughLines 的作者制定了一个规则:如果 theta > pi/2,穿过图像左侧的线具有正 rho 而穿过图像顶部的线有负 rho.
Rho 是 'bucket' 或累加器数组的大小,用于所有传入的 rho,或距原点的距离。图像中可能的最长距离是从左上角到右下角,因此为了获得最大的准确性,将该值插入 houghlines rho。
Theta 是所有传入 theta 的桶的大小。为获得最大精度,您需要 180 的值。要仅检测偶数角度,theta 应为 90。要仅检测可被 30 整除的角度,theta 应为 6
我有一个关于 HoughLines 的 opencv 库的问题。格式如下来自官网:
C++: void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )
以及lines输出数组参数的解释,是这样写的:
lines – 线的输出向量。每条线由一个二元向量表示:rho 和 theta。垂直线 theta 为 0,水平线(辐射度)为 pi/2。
请问theta的原理是什么?貌似theta在0~1.57之间(因为pi/2是1.57),但是我运行代码发现theta可以超过1.57变成一些奇怪的值,如下图,红线是HoughLines检测到的线,sita是参数lines中的值?
谁能告诉我线输出的 theta 的规律性是什么?
非常感谢!
我是这样理解的。我认为你的控制台应该显示的角度是橙色的(大约 -0.72 弧度)。但似乎 OpenCV 对所有平行线都使用正角。我的意思是你的控制台显示的紫色角度(大约 2.5 弧度)。所以你的线有这个 theta 和 rho (到线的距离)是负值。这是因为您的线位于原点的右侧。 (我是用Paint画的,不好看请见谅)
OpenCV 的文档、此问题的其他答案和维基百科(在撰写此答案时)是错误的。这是我一生中第一次在维基百科中发现技术错误。
cv2.HoughLines 为您提供映射到线的对 (r, theta)。 Theta 是(图像的)x 轴和直线之间的逆时针角度。它介于零和 pi 之间。 Rho是从图像左上角到直线的"distance"。正如 OP 指出的那样,rho 通常为负,因此距离不合适。以下是 OpenCV 作者的意思:
如果 theta < pi/2,我们谈论的是一条从图像左下角到右上角的直线。在这种情况下,它不能穿过 0 以下的 x 轴,并且我们确切地知道要绘制的线(给定 rho)。到目前为止,OpenCV 文档是正确的。
如果theta > pi/2,那么我们需要消除与原点等距的两条平行线之间的歧义。为了解决这个问题,HoughLines 的作者制定了一个规则:如果 theta > pi/2,穿过图像左侧的线具有正 rho 而穿过图像顶部的线有负 rho.
Rho 是 'bucket' 或累加器数组的大小,用于所有传入的 rho,或距原点的距离。图像中可能的最长距离是从左上角到右下角,因此为了获得最大的准确性,将该值插入 houghlines rho。 Theta 是所有传入 theta 的桶的大小。为获得最大精度,您需要 180 的值。要仅检测偶数角度,theta 应为 90。要仅检测可被 30 整除的角度,theta 应为 6