霍夫直线变换介绍
1、Hough Line Transform用来做直线检测
2、前提条件——边缘检测已经完成
3、平面空间到极坐标空间转换
import cv2 as cv
import numpy as np
def line_detection(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# apertureSize做Canny时梯度窗口的大小
edges = cv.Canny(gray, 50, 150, apertureSize=3)
# 返回的是r和theta
lines = cv.HoughLines(edges, 1, np.pi/180, 200)
for line in lines:
print(type(line))
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
# 乘以1000,是根据源码乘的,通过x1、x2、y1、y2画一条直线
x1 = int(x0+1000*(-b))
y1 = int(y0+1000*a)
x2 = int(x0-1000*(-b))
y2 = int(y0-1000*a)
cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) # 2是所画直线长度的宽
cv.imshow('image_lines', image)
def line_detect_possible_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 做Canny时梯度窗口的大小
edges = cv.Canny(gray, 50, 150, apertureSize=3)
# minLineLength是线段最小长度,maxLineGap是线段最大间隔,该间隔之内的认为是一条直线
lines = cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50, maxLineGap=10)
for line in lines:
print(type(line))
# (x1,y1),(x2,y2)是线段的两点,只画出了一个个线段
x1, y1, x2, y2 = line[0]
cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv.imshow('image_lines', image)
src = cv.imread('C:/Users/Y/Pictures/Saved Pictures/morph02.png')
cv.namedWindow('input image', cv.WINDOW_AUTOSIZE)
cv.imshow('input image', src)
line_detect_possible_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()