作者 | Greg Surma

来源 | Medium

​编辑 | 代码医生团队

在今天的文章中,将使用基本的计算机视觉技术来解决对于自动驾驶汽车至关重要的街道车道检测问题。到本文结束时,将能够使用Python和OpenCV执行实时通道检测。

实时车道检测

履行

可以在GitHub上找到这个项目的完整代码库

https://github.com/gsurma/street_lanes_finder?source=post_page---------------------------

从定义问题开始。

鉴于道路的图像,想检测它上面的街道。

为了做到这一点,提供一个图像路径并用OpenCV加载它,然后用它来调用find_street_lanes管道。

test_image = cv2.imread(INPUT_FOLDER + TEST_IMAGE)
street_lanes = find_street_lanes(test_image)

这就是find_street_lanes管道的样子

def find_street_lanes(image):grayscale_image = grayscale(image)blur_image = blur(grayscale_image)canny_image = canny(blur_image)roi_image = roi(canny_image)hough_lines_image = hough_lines(roi_image, 0.9, np.pi/180, 100, 100, 50)final_image = combine_images(hough_lines_image, image)

灰度

管道的第一步是从彩色到灰度的图像转换。这样做是因为颜色值不包含任何有价值的信息,因此为了使进一步处理更简单,更快将三个通道转换为一个。

grayscale = (r + g + b) / 3
grayscale_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

模糊

然后为了使图像更平滑,噪点更小,应用了一个温和的高斯模糊。

高斯模糊通过计算每个像素的值作为周围像素的加权平均值来工作。

blur_image = cv2.GaussianBlur(image, (3,3),0)

Canny(边缘检测)

这是有趣的部分开始的地方。现在有了平滑的灰度图像,需要检测其中的边缘。

仅供参考,它被称为'canny',因为它是由John Canny发明的。

在没有涉及太多细节的情况下,canny边缘检测器的核心部分基于扫描图像并计算相邻像素值的导数(梯度)。渐变越高,边缘越可能。

高梯度区的一个例子

canny_image = cv2.Canny(image, 100, 150)

感兴趣的区域

现在检测到边缘,可以清楚地看到街道在哪里,但除此之外,还可以看到其他边缘是多余的。为了摆脱它们,应该将图像掩盖到一个称为感兴趣区域(ROI)的特定区域。确定适当的ROI在很大程度上取决于摄像机校准及其框架,即道路的哪个部分是可见的。

bottom_padding = 100 # Front bumper compensation
height = image.shape[0]
width = image.shape[1]
bottom_left = [0, height-bottom_padding]
bottom_right = [width, height-bottom_padding]
top_right = [width*1/3, height*1/3]
top_left = [width*2/3, height*1/3]
vertices = [np.array([bottom_left, bottom_right, top_left, top_right], dtype=np.int32)]
mask = np.zeros_like(image)
cv2.fillPoly(mask, vertices, 255)
masked_image = cv2.bitwise_and(image, mask)

这是定义的蒙版,其中白色显示ROI

这是带有蒙面感兴趣区域的精确图像。

Hough Lines

现在有明确界定的线条,显示街道所在的位置。但是在屏幕上显示它们看起来并不吸引人,因为它们很吵和闪烁。为了将它们可视化为单行,需要执行霍夫线变换。

首先,检测所有行。将一条线定义为[x1,y1,x2,y2],其中(x1,y1)是它的开始,(x2,y2)是它的结束。

将线条定位后,可以计算它们的斜率,以确定它们是正确的还是左边的。

  parameters = np.polyfit((x1, x2), (y1, y2), 1)slope = parameters[0]intercept = parameters[1]if slope >= 0: right_lines.append([slope, intercept])else:left_lines.append([slope, intercept])

然后需要平均线并得到单个左右线。

  def merge_lines(image, lines):if len(lines) > 0:slope, intercept = np.average(lines, axis=0)y1 = image.shape[0]y2 = int(y1*(1/2))x1 = int((y1 - intercept)/slope)x2 = int((y2 - intercept)/slope)return np.array([x1, y1, x2, y2])left = merge_lines(image, left_lines)right = merge_lines(image, right_lines)

最后,可以画出最后的界限。

 lines_image = np.zeros((image.shape[0], image.shape[1], 3), dtype=np.uint8)lines = cv2.HoughLinesP(image, rho, theta, threshold, np.array([]), minLineLength=min_line_len, maxLineGap=max_line_gap)if lines is not None:lines = averaged_lines(image, lines)for line in lines:if line is not None:x1,y1,x2,y2 = linecv2.line(lines_image, (x1, y1), (x2, y2), (0, 0, 255), 20)return lines_image

图像叠加

最后,需要使用派生线覆盖输入图像。

combined_image = cv2.addWeighted(initial_image, α, image, β, λ)

实时检测

拥有可以检测单个帧的线路的管道,可以在每个帧上执行检测的视频流上实时运行它。

下一步是什么?

在这个项目中,学会了如何使用基本的计算机视觉技术来解决现实问题。虽然结果看起来非常有希望,但街道探测器并非完美,在某些情况下可能会失败。这就是为什么在下一部分将使用深度学习方法(整体嵌套边缘检测)来获得更好的准确性和更可靠的探测器。敬请关注!

不要忘记检查项目的GitHub页面。

https://github.com/gsurma/street_lanes_finder?source=post_page---------------------------

边缘检测后去除噪点_Street Lanes Finder - 检测自动驾驶汽车的车道相关推荐

  1. 边缘检测后去除噪点_修图前vs修图后,原来那些网红“照骗”都是这样修出来的!...

    如今手机上有许多功能强大的后期app 都能帮助我们轻松实现一键修图 我们也经常可以在网上看到 各路大神们各显神通的手机修图作品 无论是风景.人像还是创意 修图前和修图后对比强烈.美若两图 看到这里你是 ...

  2. 边缘检测后去除噪点_图片背景处理与噪点去除

    概述 本文主要讲述的是数字图像处理中对图像背景的处理以及图片噪点的去除,运用到的方法有高斯模糊.灰度二值化.连通域检检测 1.算法原理 高斯模糊 引用Wikipedia的两句话: Mathematic ...

  3. 关掉可穿戴部门后,英特尔还将调整自动驾驶业务

    作者 | DavidZh 出品 | AI科技大本营(公众号ID:rgznai100) 上周,国外媒体 The Information 援引知情人消息称,英特尔将关掉 Vaunt 智能眼镜所在的可穿戴产 ...

  4. 独家 | 离开百度后,王劲创办的景驰将于2020年6月量产自动驾驶汽车

    本文系网易新闻-智能工作室出品 聚焦AI,读懂下一个大时代! 网易年度AI人物评选--2017网易AI英雄风云榜,自荐提名进行中! 奖项设置:技术创新人物TOP 10,商业创新人物TOP 10 表彰人 ...

  5. 将 AR 新创公司收入囊中后,Lyft 的自动驾驶脚步要加快了

    Lyft 筹划已久的自动驾驶汽车终于正式亮相了. 据雷锋网了解,这款车采用了福特 Fusion 混动平台,辅以 Lyft 自动驾驶团队工程师自主开发的技术.除此之外,Lyft 还宣布了一个收购项目,L ...

  6. 先电动,后智能,比亚迪为何能引领自动驾驶商业化?

    先电动,后智能,比亚迪在汽车电动智能化变革浪潮下,又一次引领市场. 1月12日,由比亚迪与美国科创公司Nuro(下称"Nuro")联合研发设计的第三代纯电动无人驾驶配送车正式发布. ...

  7. 从去除噪点的说起,有OpenCV要什么PS?

    写在最前 想必生活在2020的我们一定不得不对PS有所了解或者接触,虽然现在借助人工智能技术,ps已经变成了一代"神级"妖术,但是忆往昔,早期的PS其实也不过是一堆计算机视觉里的算 ...

  8. 项目启动后去除项目标题,去除时间与状态栏Android

    项目启动后去除项目标题 去除去除时间与状态栏前: public class SplashActivity extends Activity {@Overrideprotected void onCre ...

  9. 中文分词后去除停用词

     中文分词后去除停用词  当我们利用jieba进行中文分词时,主要是句子中出现的词语都会被划分,而有些词语是没有实际意思的,对于后续的关键词提取就会加大工作量,并且可能提取的关键词是无效的.所以在分词 ...

最新文章

  1. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
  2. 冒泡排序算法实现思想个人理解
  3. Apache检查配置文件语法
  4. 不包含本位置值的累乘数组
  5. 一枚菜狗子的2016总结
  6. 【2012百度之星/初赛上】B:小小度刷礼品
  7. 为什么要做一场WebRTC主题的大会?
  8. 网站数据库中“密码加密”方法思考
  9. sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系**
  10. 现代软件工程 团队作业 - 软件分析和用户需求调查 (2013 - 2014)
  11. 毕业设计后续工作目标
  12. JDK/Java 14 可能带来什么新特性?
  13. SGU 231 Prime Sum 求lt;=n内有多少对素数(a,b)使得a+b也为素数 规律题
  14. Open3d之自定义可视化
  15. SVN客户端的安装与使用----第一章
  16. 如何破解WP7并安装xap文件
  17. 记一次生产httpclient导致的tomcat假死事件
  18. ASP.NET Core学习之路04
  19. html中的导航条制作
  20. RabbitMq报错 Execution of Rabbit message listener failed

热门文章

  1. 全局变量链接时的冲突
  2. 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句
  3. 随想录(写给8-10年工作经验的同学)
  4. regester正则用法_Regester学习笔记
  5. linux 批量传文件大小,小弟我使用过的Linux命令之rz - 批量下传文件,简单易用...
  6. cmd windows 命令sleep_最实在的9个黑客命令!确定不学习下?
  7. c语言用凹入表法输出学生成绩,《数据结构课程设计方案》指导书9.doc
  8. 我的世界服务器自定义代码,《我的世界》服务器指令代码秘籍大全
  9. ctfshow-萌新-web14( 曲线救国-POST请求绕过获取网站敏感信息)
  10. ctfshow-萌新-web5( 利用位运算符控制SQL获取网站敏感信息)