Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3648460
  • 博文数量: 365
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2522
  • 用 户 组: 普通用户
  • 注册时间: 2019-10-28 13:40
文章分类

全部博文(365)

文章存档

2023年(8)

2022年(130)

2021年(155)

2020年(50)

2019年(22)

我的朋友

分类: Python/Ruby

2021-11-24 17:22:45

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 来绘制 mask

    cv2.fillPoly(mask, vertices, ignore_mask_color)

    masked_edges = cv2.bitwise_and(edges, mask)

    # 定义Hough 变换的参数

    rho = 1

    theta = np.pi/180

    threshold = 2

    min_line_length = 4 # 组成一条线的最小像素数

    max_line_gap = 5    # 可连接线段之间的最大像素间距

    # 创建一个用于绘制车道线的图片

    line_image = np.copy(img)*0

    # 对于 canny 边缘检测结果应用 Hough 变换

    # 输出“线”是一个数组,外汇跟单gendan5.com其中包含检测到的线段的端点

    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):

        pass

    def 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 output

    def 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_image

    def 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, 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_img

    def 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_edges

    def 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

阅读(1240) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~