点击下方卡片,关注“OpenCV与AI深度学习”
视觉/图像重磅干货,第一时间送达!
HoughLines() HoughLinesP()
选择合适的功能
从边缘检测开始提取潜在的线点,然后进行投票过程来识别经过这些点的线,在参数空间中累积投票。 参数空间是霍夫变换累积投票以检测图像中的线条的地方,每个维度代表被检测模型的一个参数,例如线条的斜率和截距。 在阈值化选择突出线之后,它提取由端点表示的线段,提供有关其位置和长度的详细信息。
image:8 位、单通道输入图像。 rho:累加器的距离分辨率(以像素为单位)。(1在大多数情况下是有效的) theta:累加器的角度分辨率(以弧度为单位)。(np.pi/180) 阈值:简单的阈值。较高的阈值会导致线条更少但更准确,而较低的阈值会产生相反的效果。设置此参数的最佳方法是尝试不同的值。这完全取决于您的目的。 minLineLength:最小行长度。 maxLineGap:同一直线上的点之间允许的最大间隙以链接它们。
direction_x = cos(extracted_angle=67) → velocity_x=1*direction_x
direction_y = sin(extracted_angle=67) → velocity_y=1*direction_y
# read image
image = cv2.imread("resources/blog1.png")
# conert image to gray
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# extract edges with canny edge detector
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
# apply HoughLinesP
# cv2.HoughLinesP() returns an array of lines detected in the image.
lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=75, minLineLength=100, maxLineGap=20)
if lines is not None:
for i, line in enumerate(lines):
x1, y1, x2, y2 = line[0]
dy = (y2 - y1)
dx = (x2 - x1)
# convert radian to degree and extract angle
angle = np.rad2deg(np.arctan2(dy, dx))
# Since the Y-axis increases downwards(in opencv), invert the angle.
angle = 180 - angle if angle > 0 else -angle
# different color for every line
color = tuple(np.random.randint(0, 255, 3).tolist())
# detected line
cv2.line(rgb_image, (x1, y1), (x2, y2), color, 3)
# draw shape to starting and finishing points of lines
cv2.putText(rgb_image, '>', (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 3)
cv2.putText(rgb_image, '<', (x2, y2), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 3)
# angle
cv2.putText(rgb_image, str(round(angle, 1)),(x1 , int((y1+y2)/2)), cv2.FONT_HERSHEY_SIMPLEX, 1, color, 3)
plt.imshow(rgb_image)
—THE END—
下载1:Pytorch常用函数手册
欢迎加入CV学习交流微信群!
觉得有用,记得点个赞和在看