mask = np.zeros_like(edges)
ignore_mask_color = 255 # 获取图片尺寸imshape = img.shape# 定义 mask 顶点vertices = np.array([[(0,imshape[0]),(450, 290), (490, 290), (imshape[1],imshape[0])]], dtype=np.int32)# 应用 fillpoly 来绘制 maskcv2.fillPoly(mask, vertices, ignore_mask_color)masked_edges = cv2.bitwise_and(edges, mask)# 定义Hough 变换的参数rho = 1 theta = np.pi/180threshold = 2min_line_length = 4 # 组成一条线的最小像素数max_line_gap = 5 # 可连接线段之间的最大像素间距# 创立一个用于绘制车道线的图片line_image = np.copy(img)*0 # 对于 canny 边缘检测后果利用 Hough 变换# 输入“线”是一个数组,其中蕴含检测到的线段的端点lines = cv2.HoughLinesP(masked_edges, rho, theta, threshold, np.array([]), min_line_length, max_line_gap)# 遍历“线”的数组来在 line_image 上绘制for line in lines: for x1,y1,x2,y2 in line: cv2.line(line_image,(x1,y1),(x2,y2),(255,0,0),10)color_edges = np.dstack((edges, edges, edges))
import math
import cv2
import numpy as np
"""
Gray Scale
Gaussian Smoothing
Canny Edge Detection
Region Masking
Hough Transform
Draw Lines [Mark Lane Lines with different Color]
"""
class SimpleLaneLineDetector(object):
def __init__(self): passdef detect(self,img): # 图像灰度解决 gray_img = self.grayscale(img) print(gray_img) #图像高斯平滑解决 smoothed_img = self.gaussian_blur(img = gray_img, kernel_size = 5) #canny 边缘检测 canny_img = self.canny(img = smoothed_img, low_threshold = 180, high_threshold = 240) #区域 Mask masked_img = self.region_of_interest(img = canny_img, vertices = self.get_vertices(img)) #霍夫变换 houghed_lines = self.hough_lines(img = masked_img, rho = 1, theta = np.pi/180, threshold = 20, min_line_len = 20, max_line_gap = 180) # 绘制车道线 output = self.weighted_img(img = houghed_lines, initial_img = img, alpha=0.8, beta=1., gamma=0.) return outputdef grayscale(self,img): return cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)def canny(self,img, low_threshold, high_threshold): return cv2.Canny(img, low_threshold, high_threshold)def gaussian_blur(self,img, kernel_size): return cv2.GaussianBlur(img, (kernel_size, kernel_size), 0)def region_of_interest(self,img, vertices): mask = np.zeros_like(img) if len(img.shape) > 2: channel_count = img.shape[2] ignore_mask_color = (255,) * channel_count else: ignore_mask_color = 255 cv2.fillPoly(mask, vertices, ignore_mask_color) masked_image = cv2.bitwise_and(img, mask) return masked_imagedef draw_lines(self,img, lines, color=[255, 0, 0], thickness=10): for line in lines: for x1,y1,x2,y2 in line: cv2.line(img, (x1, y1), (x2, y2), color, thickness)def slope_lines(self,image,lines): img = image.copy() poly_vertices = [] order = [0,1,3,2] left_lines = [] right_lines = [] for line in lines: for x1,y1,x2,y2 in line: if x1 == x2: pass else: m = (y2 - y1) / (x2 - x1) c = y1 - m * x1 if m < 0: left_lines.append((m,c)) elif m >= 0: right_lines.append((m,c)) left_line = np.mean(left_lines, axis=0) right_line = np.mean(right_lines, axis=0) for slope, intercept in [left_line, right_line]: rows, cols = image.shape[:2] y1= int(rows) y2= int(rows*0.6) x1=int((y1-intercept)/slope) x2=int((y2-intercept)/slope) poly_vertices.append((x1, y1)) poly_vertices.append((x2, y2)) self.draw_lines(img, np.array([[[x1,y1,x2,y2]]])) poly_vertices = [poly_vertices[i] for i in order] cv2.fillPoly(img, pts = np.array([poly_vertices],'int32'), color = (0,255,0)) return cv2.addWeighted(image,0.7,img,0.4,0.)def hough_lines(self,img, rho, theta, threshold, min_line_len, max_line_gap): lines = cv2.HoughLinesP(img, rho, theta, threshold, np.array([]), minLineLength=min_line_len, [Skrill下载](https://www.gendan5.com/wallet/Skrill.html)maxLineGap=max_line_gap) line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8) line_img = self.slope_lines(line_img,lines) return line_imgdef weighted_img(self,img, initial_img, alpha=0.1, beta=1., gamma=0.): lines_edges = cv2.addWeighted(initial_img, alpha, img, beta, gamma) return lines_edgesdef get_vertices(self,image): rows, cols = image.shape[:2] bottom_left = [cols*0.15, rows] top_left = [cols*0.45, rows*0.6] bottom_right = [cols*0.95, rows] top_right = [cols*0.55, rows*0.6] ver = np.array([[bottom_left, top_left, top_right, bottom_right]], dtype=np.int32) return ver