车道识别
步骤
- 区域感兴趣
- 高斯模糊
- 图片灰度化
- 边缘提取
- 膨胀腐蚀
- 中值滤波
- 霍夫圆环检测直线
- 绘制车道
import cv2
import numpy as np
def create_roi_mask(frame):
height, width = frame.shape[:2]
# 三角形的顶点
top_vertex = [int(width / 2 + 30), int(height * 0.5 + 30)]
bottom_left = [120, height-50]
bottom_right = [width-120, height-50]
# 定义三角形的点集
triangle = np.array([bottom_left, top_vertex, bottom_right], np.int32)
# 创建一个与原帧同样大小的空白掩模,注意这里只创建了一个单通道的掩模
mask = np.zeros((height, width), dtype=np.uint8)
# 使用填充多边形函数填充三角形区域
cv2.fillPoly(mask, [triangle], [255])
return mask
def create_color_mask(frame):
# 将BGR图像转换为HSV颜色空间
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 设置白色和黄色的HSV阈值
lower_white = np.array([0, 0, 100]) # 白色下限
upper_white = np.array([180, 80, 255]) # 白色上限
lower_yellow = np.array([20, 100, 100]) # 黄色下限
upper_yellow = np.array([30, 255, 255]) # 黄色上限
# 应用HSV阈值
white_mask = cv2.inRange(hsv, lower_white, upper_white)
yellow_mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
# 合并两个阈值图像
combined_mask = cv2.bitwise_or(white_mask, yellow_mask)
return combined_mask
if __name__ == '__main__':
cap = cv2.VideoCapture('carlines.mp4')
while True:
ret,frame = cap.read()
if ret == False:
break
roi_mask = create_roi_mask(frame)
# color_mask = create_color_mask(frame)
r = cv2.bitwise_and(frame, frame, mask=roi_mask)
cv2.imshow('r', r)
image = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
image = cv2.GaussianBlur(image, (3, 3), 0)
image_Canny = cv2.Canny(image, 70, 100)
cv2.imshow('image_Canny', image_Canny)
roi = cv2.bitwise_and(image_Canny, image_Canny, mask=roi_mask)
cv2.imshow('roi', roi)
# image = cv2.bitwise_and(image_Canny, image_Canny, mask=color_mask)
# cv2.imshow('color_segmentation', image)
img = roi
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 1))
kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 3))
img = cv2.dilate(img, kernelX, iterations=2)
img = cv2.erode(img, kernelX, iterations=1)
img = cv2.erode(img, kernelY, iterations=1)
img = cv2.dilate(img, kernelY, iterations=1)
# img = cv2.dilate(img, kernelX, iterations=1)
cv2.imshow('2', img)
image_blur = cv2.medianBlur(img, 15)
cv2.imshow('3', img)
lines = cv2.HoughLinesP(img, 1, np.pi / 180, 60, minLineLength=20, maxLineGap=10)
if lines is not None:
for line in lines:
for x1, y1, x2, y2 in line:
cv2.line(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.imshow("image_lines", frame)
cv2.waitKey(0)
cv2.destroyAllWindows()