opencv 边缘平滑_基于OpenCV的车道检测实现(一)

bf95e82647670c985a5c6979d4483000.png

无人驾驶的话题日趋起热,而车道线检测对于无人驾驶的路径规划来讲特别重要。要遵守交通规则,首先的要求便是对车道线检测,而且通过检测车道线可以进一步的检测地面指示标志、进行前碰撞预警策略设计等。

早早就对OpenCV感兴趣,但迟迟未去实践,现在我们就一起看看如何基于OpenCV进行检测吧!

步骤:

1、Canny边缘检测算法的实现

2、OPENCV ROI(感兴趣区域替换)

3、霍夫变换

4、离群值过滤

5、最小二乘拟合

6、直线绘制与整合

1、canny边缘检测算法

Opencv中的几种边缘检测算法_人工智能_k-CSDN博客​blog.csdn.net
d7cbe406c58fcae1ead54ac982708af6.png

首先,Canny 边缘检测是一种非常流行的边缘检测算法。忘记讲了,前面需要将图片灰度化,这样使得图片更好处理。

原图:

ab996fd9bc273faeffe334e43930e756.png

灰度之后:

520bfb15315e0286169baf9e5b3376f6.png
img=cv2.imread('img.jpg',cv2.IMREAD_GRAYSCALE)

接着进行边缘检测:

9cd56e40909769d9d8ac6513deb63cee.png
edge_img=cv2.Canny(img,100,150)

Canny边缘检测算法:

step1:用高斯滤波器平滑图象;

step2:用一阶偏导的有限差分来计算梯度的幅值和方向;

step3:对梯度幅值进行非极大值抑制;

step4:用双阈值算法检测和连接边缘。

Canny(名称,下阈值,上阈值)

a2dd9bd77eb80c0ff7ad966244ee26d2.png

主要利用梯度来看是否为边缘,上阈值以上的保留,下阈值以下的消去,中间的若与上阈值相连的则可留下,这样则可消去大量噪点。

2、roi去除背景

opencv ROI(感兴趣区域替换)​www.cnblogs.com

首先,要考虑原图以什么形式保存,这里采用的是利用掩码,产生一块对应的画布,进行替代。

640fa088d57b9a499b2a8116bef65fd0.png
mask=np.zeros_like(edge_img)
mask=cv2.fillPoly(mask,np.array([[[20,488],[700,100],[130,200],[120,200]]]),color=255)
masked_edge_img=cv2.bitwise_and(edge_img,mask)

这里则需要确定画布的四个点的位置,color=255为黑色。

3、霍夫变换

霍夫变换​www.cnblogs.com

在直角坐标系中,我们可以通过绘制 y 对 x 的图像来表示 y=mx+b。但在霍夫空间中,我们也可以通过绘制 b 对 m 的图像将这条线表示为一个点,即用极坐标方程。

例如,直线方程 y=2x+1 在霍夫空间中可能是用 (2, 1) 表示的。

5eb8cd0e980ffc8897fe287dd3ab2c21.png

例如,对极坐标系中的点 (8, 6)、(4, 9) 和 (12, 3),我们在霍夫空间中绘制出的相应图像如下:

b53037c86254ddcbb5dbf9d2720aa7ec.png

在霍夫空间中相交的曲线越多,意味着用交点表示的线对应的点越多。如此,我们便可在霍夫空间中定义了交点的最小阈值,以便检测车道线,消去无用的线。如果交点数量超过了定义的阈值,我们就确定一条对应参数 θ 和 r 的线。

left_lines=[line for line in lines if calculate_slope(line)>0]
right_lines=[line for line in lines if calculate_slope(line)<0]
def reject_abnormal_lines(lines,threshold):slopes=[calculate_slope(line) for line in lines]while len(lines)>0:mean=np.mean(slopes)diff=[abs(s-mean) for s in slopes]idx=np.argmax(diff)if diff[idx]>threshold:slopes.pop(idx)lines.pop(idx)else:breakreturn lines
reject_abnormal_lines(left_lines,threshold=0.002)

通过以上三步,我们便可初步将车道线的位置确定下来。欢迎大家一起来尝试!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串equal_Java String:字符串常量池

作者&#xff1a;Seven_Nee来自&#xff1a;https://segmentfault.com/a/1190000009888357作为最基础的引用数据类型&#xff0c;Java 设计者为 String 提供了字符串常量池以提高其性能&#xff0c;那么字符串常量池的具体原理是什么&#xff0c;我们带着以下三个问题&#xff…

cubemx串口的发送与接收_串口收发模块设计

串口收发模块设计作者&#xff1a;巩文宏 公众号&#xff1a;数字积木 该串口收发模块有串口发送模块&#xff0c;串口接收模块&#xff0c;波特率生成模块&#xff0c;发送数据fifo模块&#xff0c;接收数据的fifo模块组成。 默认配置下&#xff0c;要求输入的参考时钟为50MHz…

字段类型 sqoop_数据迁移工具Sqoop

熬过去&#xff0c;出众。熬不过&#xff0c;出局。这是最真实的人生&#xff0c;人都是熬过来的。Sqoop 是一个用来将Hadoop和关系型数据库中的数据相互转移的工具&#xff0c;它是Hadoop环境下连接关系数据库与Hadoop存储系统的桥梁&#xff0c;支持多种关系型数据源和Hive、…

git 删除tag_git使用教程9pycharm 使用 tag 打标签

前言当我们的代码完成了第一阶段的需求&#xff0c;版本稳定后&#xff0c;希望能出个稳定版本。于是在 commit 后需要打个 tag 标签&#xff0c;也就是我们平常说的版本号&#xff0c;如v1.0版本本篇讲解如何使用 pycharm 打 tag 标签&#xff0c;并推送到 github 上&#xff…

模块 python_Python入门基础:模块基础

模块是一个文件(.py文件)&#xff0c;包含变量&#xff0c;类定义语句和与特定任务相关的功能。预先装有Python的Python模块称为标准库模块。创建我们的模块我们将创建一个名为tempConversion.py的模块&#xff0c;该模块将值从F转换为C&#xff0c;反之亦然。# tempConversion…

hash地址_深入浅出一致性Hash原理

一、前言在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上&#xff0c;这样每台服务器固定处理一部分请求&#xff08;并维护这些请求的信息&#xff09;&#xff0c;起到负载均衡的作用。但是普通的余数hash&#xff08;hash(比如用…

go语言io reader_Go语言中的io.Reader和io.Writer以及它们的实现

在使用Go语言的过程中&#xff0c;无论你是实现web应用程序&#xff0c;还是控制台输入输出&#xff0c;又或者是网络操作&#xff0c;不可避免的会遇到IO操作&#xff0c;使用到io.Reader和io.Writer接口。也也许对这两个接口和相关的一些接口很熟悉了&#xff0c;但是你脑海里…

hive 开窗函数_Hive的架构剖析

本文主要介绍Hive的架构和以及HQL的查询阶段&#xff0c;主要内容包括&#xff1a;Hive的架构架构中的相关组件介绍HQL的查询阶段Hive的架构hive的基本架构图如下图所示&#xff1a;相关组件介绍数据存储Hive中的数据可以存储在任意与Hadoop兼容的文件系统&#xff0c;其最常见…

ntr模式_ntr什么意思?求详细解释。。。

展开全部是俚语&#xff0c;表示环境的意32313133353236313431303231363533e59b9ee7ad9431333433623738思。1、语法&#xff1a;(1)可指影响人们生活的各种抽象和具体的“状况&#xff0c;环境”。可以接由that引导的主语从句&#xff0c;从句中的谓语动词一般要用虚拟式(多为动…

小程序switch内部加上文字_文字游戏大全:模拟游戏会长经营公会的小程序,你会管理公会吗?...

40000游戏爱好者已加入我们&#xff01;每天推荐好玩游戏&#xff01;加入我们&#xff0c;沐沐带你发现好游戏&#xff01;《游戏会长》游戏小程序好玩吗&#xff1f;《游戏会长》小游戏怎么玩&#xff1f;只有你想不到&#xff0c;没有我找不到的好游戏&#xff01;「良心好游…

php实现第三方邮箱登录_JavaScript实现第三方登录网站原理在这呢

点关注&#xff0c;不迷路&#xff0c;每天更新大量前端资料前端实现第三方登录之OAuth2.0协议OAuth 2.0 规定了四种获得令牌的流程。我们可以选择最适合自己的那一种&#xff0c;向第三方应用颁发令牌。下面就是这四种授权方式。授权码模式(authorization-code)简化模式(impli…

pfx证书密码怎么查询_网站是HTTP?10分钟变成HTTPS!域名免费添加配置SSL证书,变成https//环境...

对于小程序request请求需要https域名、navigator.geolocation定位也需要在https环境下才可以生效等问题&#xff1b;前端开发越来越需要https环境来来测试一下API接口和各类问题&#xff0c;今天来讲解一下怎么免费快速把普通的http网站配置升级成https协议。首先向大家介绍一下…

define定义的是什么类型_为什么Django 3后建议使用Field.choices枚举类型定义choices选项...

Django 3.0的主要新增功能之一是对模型字段选择的枚举。它是一种定义和约束模型Field.choices的更好方法。以前在Django模型中通常会通过定义一些“常量”和元组来定义choices&#xff0c;如下所示&#xff1a;from django.db import modelsclass Book(models.Model):UNPUBLISH…

linux卸载openjdk_Linux系列(七)——linux其他指令【rpm、yum、sudo】

1、rpm和yum1.1、介绍rpm: rpm 是由 Red Hat 公司开发的一种软件包管理方式&#xff0c;使用 rpm 我们可以方便的进行软件的安装、查询、卸载等工作&#xff0c;但是使用 rpm 命令安装 rpm 软件包&#xff0c;不能自己解决软件包之间的依赖性问题&#xff0c;需要自己一个一个去…

postgresql 客户端_一款功能强大的数据库客户端:DataGrip

前言在我们日常的程序开发中&#xff0c;很大一部分时间是在与数据库打交道。查数据&#xff0c;导数据&#xff0c;检查SQL执行计划&#xff0c;优化SQL等&#xff0c;是我们数据库开发工作的重要组成部分&#xff0c;而且很多时候我们会使用到多款数据库&#xff0c;如Oracle…

mysql主从同步报错_mysql主从同步报错

主从不同步&#xff0c;经查看发现如下报错Last_Errno: 1666​Last_Error: Error executing row event: Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT STATEMENT.问题原因&#xff1a;主从复制&#xff…

java 等待几秒_问懵逼:请站在 JVM 角度谈谈 Java 的锁?

存在的问题自旋锁自适应自旋Java 对象的内存布局(重要)synchronized 锁升级流程偏向锁轻量级锁重量级锁可重入悲观锁(互斥锁、排他锁)《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解…

mysql 创建新用户权限_MySQL创建新用户以及权限授予

1.通过mysql数据库的user表查看用户相关信息mysql> use mysql;mysql> select host,user from user;查看用户相关信息2.创建数据库mysql> create database [databasename] default character set utf8 collate utf8_general_ci;3.创建新用户mysql> create user user…

中秋祝福网页_中秋客户维系关怀,该送客户什么礼品?

企业节日礼品是企业间或者商务伙伴之间相互传达美好情意的一种体现&#xff0c;无论是送领导、送员工、还是送合作伙伴&#xff0c;礼品定制都需要根据不同赠送对象来细心选择。如果想要礼品有创意同时又能表达企业理念&#xff0c;进而达到宣传推广或者品牌认知提升的效果&…

浏览器svg插件_Archer-svgs: 异步加载svg方案

Github地址&#xff1a; ShanaMaid/archer-svgs哇哦!无限的svgs!你可以使用archer-svgs去异步加载svg并将它缓存在localStorage里&#xff0c;当你再次使用已经加载过的svg时将不需要再发起http请求。将svgs从你的js-bunlde里移除&#xff0c;并且永远减小js-bunlde的体积。&am…