传统车道线检测之黄白线、虚实车道线检测(附python代码)


前言

针对传统图像处理方法的车道线检测,提出黄白、虚实车道线的区别。之前的算法流程及代码参考:https://blog.csdn.net/m0_46988935/article/details/109234900

一、虚实线的检测

  • 车道线的线形主要有虚线和实线,但大多数车道线检测算法对这两者并不进行区分。然而在对道路环境进行感知中,虚线和实线的区分具有非常重要的作用,区分两者有利于车辆进一步推断自身所在环境,比如在车道保持算法中对虚线和实线的偏离预警应有不同的策略。
  • 而我在车道线的检测过程中基于虚线与实线的几何特征对这二者进行了区分。因为使用霍夫变换算法检测到的车道线返回的值是车道线的起点与终点的坐标,根据实际情况可知实线的长度要大于虚线的长度,因而推断出可计算检测到的车道线的长度对实线与虚线进行区分。但是为了减少计算量,我选择了计算检测到的车道线的起点与终点坐标在 y 方向上的差值以替换长度值来实现区分。
  • 假设在一帧中检测到的某条车道线的起点和终点坐标分别为 (x1,y1) 和 (x2,y2),经过这两个坐标的直线的斜率为 slope,具体算法过程如下:
    • 根据直线斜率 slope 的正负判断检测的车道为左车道还是右车道。
    • 对于左右 2 条车道,分别计算y1 与 y2 差值的绝对值,并将该长度与阈值 Threshold(我给定的是60)进行比较,若大于该阈值,则判定为实线;否则为虚线。

具体代码如下:

def solid_dotted_judge(frame, lines):
    if len(lines) > 0:
        for line in lines:
            slope, x1, y1, x2, y2 = line
            k = abs(y2 - y1)
            font = cv.FONT_HERSHEY_SIMPLEX
            # 右车道线
            if slope >0:
                if k >= 60:
                    cv.putText(frame, 'Right Solid', (int((x1 + x2) / 2)+50, int((y1 + y2) / 2)), font, 0.5, (0, 255, 0), 2)
                else:
                    cv.putText(frame, 'Right Dotted', (int((x1 + x2) / 2)+50, int((y1 + y2) / 2)), font, 0.5, (0, 255, 0), 2)
            # 左车道线
            else:
                if k >= 60:
                    cv.putText(frame, 'Left Solid', (int((x1 + x2) / 2)+50, int((y1 + y2) / 2)), font, 0.5, (0, 255, 0), 2)
                else:
                    cv.putText(frame, 'Left Dotted', (int((x1 + x2) / 2)+50, int((y1 + y2) / 2)), font, 0.5, (0, 255, 0), 2)

二、黄白线的检测

  • 首先我们需要了解HSV颜色空间个颜色参数值,
    在这里插入图片描述
    从上表可以得知,将颜色空间从 RGB 转成 HSV 后,白色的 S (饱和度)参数值介于 [0,30] 之间,而黄色的 S 参数介于 [43,255] 之间,两者存在着清晰的界限,在假定只有黄白车道线的前提下,只要判定某一像素点的 S 参数值大于 40,那么就可以认为该点为黄点。进而,在检测出的车道线上取若干(以 11 为例)个点分别判断 S 值,如果黄点的个数超过阈值(以 4 为例),则判定该线为黄线,否则判断为白线。
def color_judge(frame, frame1, lines):
    frame2 = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    L = []
    if len(lines) > 0:
        for i in range(len(lines)):
            L.append(lines[i])
        for line in L:
            # print(line)
            slope, x1, y1, x2, y2= line
            p = 0
            for i in range(1, 11):
                y = int(y1 + (y2 - y1) * i / 11)
                x = int(x1 + (x2 - x1) * i / 11)
                # print(x, y)
                h, s, v = frame2[y][x]
                if s > 40:
                    p += 1
            if p >= 3:
                font = cv.FONT_HERSHEY_SIMPLEX
                cv.putText(frame1, 'Yellow', (int((x1 + x2) / 2), int((y1 + y2) / 2)), font, 0.5, (0, 255, 255), 2)
            else:
                font = cv.FONT_HERSHEY_SIMPLEX
                cv.putText(frame1, 'White', (int((x1 + x2) / 2), int((y1 + y2) / 2)), font, 0.5, (255, 255, 255), 2)
  • 6
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: ArcGIS JS API是一款基于JavaScript的GIS应用程序编程接口,可以轻松实现各种GIS应用。动态轨迹线是一种非常常见的GIS应用,可以用来展示航行船舶、移动物体等的运动轨迹。在ArcGIS JS API中,动态轨迹线可以通过以下几个步骤实现: 1. 准备数据:首先需要准备运动轨迹数据,包括每一时刻该物体的位置、速度、航向等信息。这些数据可以从GPS、传感器等设备中获取,也可以使用模拟数据进行实验。 2. 绘制图层:使用ArcGIS JS API中的GraphicsLayer类来绘制图层,并将图层添加到地图中。为了实现动态效果,可以使用setInterval()函数定时更新图层数据。 3. 设置符号:利用SimpleLineSymbol类来设置轨迹线的样式,包括颜色、宽度、虚实等。 4. 更新数据:在定时更新的函数中,利用GraphicsLayer的clear()方法清除上一帧的数据,然后用新的位置数据更新GraphicsLayer的graphics数组即可。 5. 实现动态效果:为了展示动态效果,可以使用AnimationUtils类来控制轨迹线的动画效果。比如,可以使用move()方法让轨迹线沿着指定路径移动,或者使用fadeIn()、fadeOut()等方法控制轨迹线的出现和消失效果。 总之,ArcGIS JS API提供了丰富的类和方法,可以轻松实现动态轨迹线效果。只需要准备好数据,选择适当的类和方法,就可以创建出令人惊叹的GIS应用。 ### 回答2: ArcGIS JS API 是一个用于构建 WebGIS 应用程序的 JavaScript 库,可以提供地图显示、定位、搜索和分析等功能。使用该库,可以轻松实现动态轨迹线。 首先,需要获取轨迹数据。一般来说,轨迹数据包括时间戳、经度、纬度等信息。可以从设备或数据库中获得,也可以通过接口实时获取。 其次,需要定义一个轨迹线样式。可以定义颜色、线宽、透明度等属性,以使轨迹线看起来更加美观。 接下来,需要使用 ArcGIS JS API 创建一个 MapView,将轨迹数据添加到地图上。可以使用 GraphicsLayer 将轨迹数据转换为轨迹线,并将其添加到地图上。然后可以启动定时器,并在每个时间戳更新轨迹线。 需要在定时器事件中将轨迹数据添加到轨迹线图层中,并更新地图视图。可以使用 Polyline、Graphic等类来处理轨迹线。 最后,需要在地图上添加一些控件,以便用户可以控制轨迹线的显示和隐藏。可以使用 ToggleButton 控制轨迹线的显示和隐藏。 综上所述,实现动态轨迹线需要以下步骤: 1. 获取轨迹数据 2. 定义轨迹线样式 3. 创建 MapView,添加轨迹线图层 4. 启动定时器 5. 在定时器事件中更新轨迹线 6. 添加控件,控制轨迹线的显示和隐藏 以上是实现动态轨迹线的基本步骤。具体实现时,还需要根据实际需求进行调整和优化。 ### 回答3: arcgis js api 是一款使用 JavaScript 编写的地图应用程序接口,它能够方便地实现在 Web 应用程序中构建交互式地图和地图组件。在 arcgis js api 中实现动态轨迹线需要以下步骤: 1. 准备数据 首先,需要准备好需要绘制的轨迹线的数据。可以使用 GPS 数据、传感器数据、飞行控制数据或任何有坐标信息的数据来绘制动态轨迹线。数据需要包含经度和纬度的坐标信息、高度信息、时间戳或时间信息等。 2. 加载地图 在 arcgis js api 中使用 esri/Map 模块加载地图,可以从 arcgis online 或本地地图服务中加载地图。可以选择使用卫星、矢量或混合视图,以及设置地图的初始缩放级别和中心点。 3. 添加图层 使用 esri/Graphic 和 esri/layers/GraphicsLayer 模块添加 GraphicsLayer 图层,并将轨迹线数据添加到图层中。 4. 绘制轨迹线 使用 esri/geometry/Point 和 esri/geometry/Polyline 模块从轨迹线数据中获取经纬度坐标信息,并将它们转换为多边形点坐标信息,再将多边形点坐标信息填充到 Polyline 对象中,最后使用 esri/Graphic 模块将 Polyline 对象添加到 GraphicsLayer 图层中。 5. 更新轨迹线 随着时间的推移,更新轨迹线需要在 Polygon 对象中添加新的点坐标信息,然后使用 GraphicsLayer 对象的 remove 和 add 方法更新轨迹线图层,使其可视化效果实现动态轨迹线。 总之,ArcGIS JS API 实现动态轨迹线需要加载地图,添加图层,绘制轨迹线,更新轨迹线等步骤。可以使用客户端钩子来实现轨迹线的实时更新,使动态轨迹线更加真实。在地图应用程序中实现动态轨迹线可以在交互性和可视化效果上增强用户体验,从而实现更好的地图服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值