zoukankan      html  css  js  c++  java
  • 检测车道线——1.检测车道 Color Selection

           本文的图片和代码大多来自优达无人驾驶工程师课程,目的是为了记录自己学习过程总结经验错误,侵删。

      目前工程师促使自动驾驶一般采用两种不同方式:机器人技术和深度学习。很多年来,机器人技术用于融合一套传感器输出的数据直接测量汽车周边环境然后驾驶。近期,开始使用深度学习,模仿人类驾驶行为。机器人技术和深度学习方法都在运用发展。

    这是 Udacity 无人驾驶课程的项目1,在python中实现。

    一、检测车道 Color Selection

      教车开车,教车感知世界。用摄像头和传感器获取车道线信息。第一个模块是编写代码识别和跟踪一系列图像中车道线的位置。基于图像分析技术。

      简单地说就是把路面上的行车线找出来。由于行车线的颜色与周围环境有一定区分,我们可以对RGB分别设定阈值,把有用的信息分离出来。

     

      车道线在图像中显示是白色的。数字图像由红绿蓝三个图像组成,有时也叫作3个颜色通道。每个颜色通道的像素值从0到255不等。0是最暗的部分,255是最亮的部分。
            练习题:如果0是黑暗的255是亮的,在红绿蓝三个图像组合的图像里面,纯白怎么表示呢? 
      答案:[255,255,255]

    步骤:

     1.加载numpy和matplotlib库

     2.获取坐标轴并拷贝图片

     3.定义颜色阈值

     4.选择像元并输出

     1          #1.导入库
     2    import matplotlib.pyplot as plt       #Matplotlib 是一个 Python 的 2D绘图库
     3    import matplotlib.image as mpimg
     4    import numpy as np                     #NumPy是Python的一种开源的数值计算扩展
     5    
     6         #2.读取图片并输出状态:得到x和y轴的数值,对图片进行拷贝(copy)
     7    image=mpimg.imread('E:/spyder/a/a/test.jpg')
     8    print('This image is :',type(image),
     9         'with dimensions:',image.shape)
    10    ysize=image.shape[0]                   #获取x轴和y轴并对图片进行拷贝
    11    xsize=image.shape[1]
    12    color_select=np.copy(image)         #用copy拷贝而不是用‘=’
    13  
    14         #3.接下来,我在变量red_threshold,green_threshold和blue_threshold中定义颜色的阈值,并用这些值填充rgb_threshold。 这个矢量包含我在选择时允许的红色,绿色和蓝色(R,G,B)的最小值。
    15    red_threshold=0
    16    green_threshold=0
    17    blue_threshold=0                 #若红绿蓝的阈值都设置为0,则说明图片的全部像素都被选中
    18    rgb_threshold=[red_threshold,green_threshold,blue_threshold]
    19  
    20        #4.接下来,我将选择阈值以下的任何像素并将其设置为零。之后,符合我的颜色标准(高于阈值)的所有像素将被保留,而那些不符合阈值的像素将被黑掉。
    21     #用布尔值或者'|'来识别低于阈值的像元
    22    thresholds= (image[:,:,0]<rgb_threshold[0])      
    23              | (image[:,:,1]<rgb_threshold[1]) 
    24              | (image[:,:,2]<rgb_threshold[2])
    25    color_select[thresholds]=[0,0,0]       #color_select 是选择像素高于阈值的结果,低于阈值的显示黑色。
    26  
    27    plt.imshow(color_select)          #显示图像
    28    plt.show()

     结果如下图

    若将21~23的代码设计如下:

    21 red_threshold=200
    22 green_threshold=200
    23 blue_threshold=200

    结果如下图

    
    

    最终,我发现在red_threshold = green_threshold = blue_threshold = 200的情况下,我得到了一个相当不错的结果,在这里我可以清楚地看到车道线,但其他大部分内容都被遮住了。

    然而,在这一点上,自动提取准确的线条仍然很棘手,因为我们周围还有许多其他的像素。

    
    

    若将21~23的代码设计如下:

    21 red_threshold=150
    22 green_threshold=250
    23 blue_threshold=150
    结果如下图

  • 相关阅读:
    循环控制Goto、Break、Continue
    linux多进/线程编程(6)——进程间通信之信号
    linux多进/线程编程(5)——进程间通信之mmap
    docker学习笔记(6)——docker场景问题汇总(centos7 由于内核版本低带来的一系列问题,docker彻底卸载,安装、启动日志报错分析)
    c/c++ 日常积累
    broken pipe 报错分析和解决办法
    c/c++ 常见字符串处理函数总结 strlen/sizeof strcpy/memcpy/strncpy strcat/strncat strcmp/strncmp sprintf/sscanf strtok/split/getline atoi/atof/atol
    docker学习笔记(5)——docker场景问题汇总(docker权限问题、docker文件目录、查看docker历史日志文件)
    linux多进/线程编程(4)——进程间通信之pipe和fifo
    linux多进/线程编程(3)——wait、waitpid函数和孤儿、僵尸进程
  • 原文地址:https://www.cnblogs.com/minyshi/p/8573470.html
Copyright © 2011-2022 走看看