基于opencv的巡线方案
目录
背景
实际效果:
两侧车道线效果:
单侧车道线效果:
十字路口车道线补齐
代码讲解:
基础部分:
十字路口补线:
缺点:
注意事项:
背景
在参加17届智能车百度智慧交通组竞赛的时候我脑子里就有两套方案,一套是基于传统opencv的巡线,一套是用paddle搭建神经网络框架,但由于时间有限,只能利用假期闲余时间继续写完未完成的opencv巡线
灵感来源于CSDN一位老哥的博客,但我找不到了他的那篇博客,只有代码(图中csdn借取.py)感谢老哥
实际效果:
两侧车道线效果:
单侧车道线效果:
十字路口车道线补齐
代码讲解:
基础部分:
import cv2
import numpy
import numpy as np# cap = cv2.VideoCapture(0)
cap = cv2.VideoCapture("./1.mp4")while True:test, frame = cap.read()frame = cv2.resize(frame, (int(frame.shape[0] / 1080 * 640), int(frame.shape[1] / 1920 * 480)))frameBGR = cv2.GaussianBlur(frame, (7, 7), 0)hsv = cv2.cvtColor(frameBGR, cv2.COLOR_BGR2HSV)# 车道线颜色colorLow = numpy.array([16, 65, 65])colorHigh = numpy.array([80, 225, 180])# 加入掩膜mask = cv2.inRange(hsv, colorLow, colorHigh)kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))# 通胀腐蚀消除干扰mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernal)mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernal)left = np.array([])leftb = np.array([])right = np.array([])rightb = np.array([])center = []center_1andex = []center_y = []left_jump_point = 0right_jump_point = 0crossroads_count = 0point_of_inflectionleft_down_x = 0point_of_inflectionleft_down_y = 0point_of_inflectionleft_up_x = 0point_of_inflectionleft_up_y = 0point_of_inflectionright_down_x = 0point_of_inflectionright_down_y = 0point_of_inflectionright_up_x = 0point_of_inflectionright_up_y = 0left_up = left_down = right_up = right_down = 0left_down1 = left_up1 = right_down1 = right_up1 = ()count = flag = 0for high_count in range(480, 0, -1):# 扫左线for width_count_left in range(321, 0, -1):if mask[high_count - 1][width_count_left] != mask[high_count - 1][width_count_left - 1]: # 跳点left = np.append(left, width_count_left)leftb = np.append(leftb, width_count_left)left_jump_point = width_count_leftcount_left = 1breakelif (width_count_left == 1):lost_point_left = 0count_left = 0# count+=1left = np.append(left, lost_point_left)leftb = np.append(leftb, lost_point_left)# 扫右线for width_count_right in range(322, 639, 1):if mask[high_count - 1][width_count_right] != mask[high_count - 1][width_count_right + 1]: # 跳点right = np.append(right, width_count_right)rightb = np.append(rightb, width_count_right)right_jump_point = width_count_rightcount_right = 1breakelif (width_count_right == 638):lost_point_right = 639count_right = 0# count+=1right = np.append(right, lost_point_right)rightb = np.append(rightb, lost_point_right)if count_left == count_right == 1:center_point_x = left_jump_point + (right_jump_point - left_jump_point) / 2center_point_y = high_countelif count_left == count_right == 0:count += 1passelif count_left == 1 and count_right == 0:center_point_x = left_jump_point + (lost_point_right - left_jump_point) / 2center_point_y = high_countelif count_left == 0 and count_right == 1:center_point_x = lost_point_left + (right_jump_point - lost_point_left) / 2center_point_y = high_countcenter.append([center_point_x, center_point_y])center_1andex.append([1, center_point_x])center_y.append(center_point_y)for i in range(len(center)):if center[i][1] >= 240:if abs(int(center[i][0]) - int(center[i - 1][0])) > 50:passelse:center[i][0] = center[i][0] - (int(center[i][0]) - int(center[i - 1][0])) / 1.1cv2.circle(mask, (int(center[i][0]), int(center[i][1])), 1, (255, 0, 255), thickness=3)cv2.imshow('hsv+opencv', mask)if center[i][1] == 240:if center[i][0] < 300:print("turn left")angle = abs(300 - center[i][0]) / 320print(angle)elif center[i][0] > 340:print("turn right")angle = abs(340 - center[i][0]) / 320print(angle)else:print("go straight")
十字路口补线:
for i in range(len(left) - 10):if (left[i] == 0 and left[i + 3] == 0 and left[i + 5] > 0 and left[i + 10] > 0):left_up = 1left_up1 = (i + min(len(left[i + 2:]), sm), left[i + min(len(left[i + 2:]), sm)]) # 480 - i-smif (left[i] > 0 and left[i + 3] > 0 and left[i + 5] == 0 and left[i + 10] == 0):left_down = 1left_down1 = (i - min(i, sm), left[i - min(i, sm)]) # 480 - i+smif (right[i] == 639 and right[i + 3] == 639 and right[i + 5] < 639 and right[i + 10] <= 639):right_up = 1right_up1 = (i + min(len(left[i + 2:]), sm), right[i + min(len(left[i + 2:]), sm)])if (right[i] < 639 and right[i + 3] < 639 and right[i + 5] == 639 and right[i + 10] == 639):right_down = 1right_down1 = (i - min(i, sm), right[i - min(i, sm)])if (left_up and not left_down):left_down1 = (0, left_up1[1])elif (not left_up and left_down):left_up1 = (479, left_down1[1])if (right_up and not right_down):right_down1 = (0, right_up1[1])elif (not right_up and right_down):right_up1 = (479, right_down1[1])if (left_up or right_up) or (left_down or right_down):for k in range(len(leftb)):if len(left_down1) > 0 and len(left_up1) > 0 and len(right_down1) > 0 and len(right_up1) > 0:if (k >= left_down1[0] and k <= left_up1[0]) or (k <= left_down1[0] and k >= left_up1[0]):leftb[k] = ((left_up1[1] - left_down1[1]) / (left_up1[0] -left_down1[0])) * (k - left_up1[0]) + left_up1[1]if (k >= right_down1[0] and k <= right_up1[0]) or (k <= right_down1[0] and k >= right_up1[0]):rightb[k] = ((right_up1[1] - right_down1[1]) / (right_up1[0] -right_down1[0])) * (k - right_up1[0]) + right_up1[1]for k in range(340, -1, -1):point3 = (int(leftb[k]), 479 - k) # 中point1 = (int(rightb[k]), 479 - k) # 右x = int((int(rightb[k]) - int(leftb[k])) / 2) + int(leftb[k])x_1 = int((int(rightb[k + 1]) - int(leftb[k + 1])) / 2) + int(leftb[k + 1])point2 = (x, 479 - k)if count > 200:print(count)flag = 1cv2.circle(mask, point2, 1, (0, 0, 250), 3)cv2.circle(mask, point3, 1, (255, 255, 0), 0)cv2.circle(mask, point1, 1, (255, 0, 0), 0)cv2.imshow("hsv+opencv", mask)if k == 240:if x < 300:print("turn left")angle = abs(300 - x) / 200print(angle)elif x > 340:print("turn right")angle = abs(340 - x) / 200print(angle)else:print("go straight")
缺点:
由于阈值设置问题,如果count阈值太大会导致十字路口跳线太慢,但阈值太小会在其他情况下蹦出一堆杂线(下图就是由于hsv提取阈值小导致失线,本来运用在十字路口的补线策略乱入)
找阈值就交给别人了哈哈
注意事项:
hsv提取阈值尽量多试,在其他场地因素影响的情况下别忘了视觉补救工具:抹布
基于opencv的巡线方案相关推荐
- 一种基于OpenCV的三维重建实现方案
一种基于OpenCV的三维重建实现方案 来源:淘金者论文范文 作者:Www.TaoJz.Com 日期:08/30/09 摘 要 本文以计算机视觉三维重建技术为研究对象,分析了开放计算机视觉函数库Ope ...
- 根据星瞳科技openmv巡线小车所改进的巡线方案
首先看一下星瞳科技的巡线方案(附上其开源源码): THRESHOLD = (5, 70, -23, 15, -57, 0) # Grayscale threshold for dark things. ...
- 自动驾驶入门(十二):基于Opencv的车道线识别
车道线识别有两种方法: 基于Opencv的传统视觉车道线识别方案 基于深度学习的车道线识别方案 本文将介绍基于Opencv的传统视觉车道线识别方案. 传统的车道线识别解决方案流程图如下: 代码实现如下 ...
- 基于STM32F103智能巡线小车
项目描述: 巡线小车是我作为新手入手的第一个项目,基本巡线功能是使用红外传感器循迹模块判断黑线的路径来确定转向方向,同时控制单片机配置PWM占空比波控制小车前进的L298N电机模块,实现前后退,左 ...
- 基于OpenCV 的车道线检测方法
车道线检测是图像处理运用到无人驾驶的一项技术,目前也过渡到了部分汽车上,高速公路的自动车道保持就是一个应用. 最近研究了两个基于opencv的车道检的代码,先放链接: A.Udacity车道线检测代码 ...
- 基于opencv的车道线识别(python)(极易实现)
简易车道线识别方法 文章目录 简易车道线识别方法 1.先上效果图 1.1原图: 1.2结果图 2.源代码 3.阈值脚本 4.谈谈优缺点 优点: 缺点: 1.先上效果图 1.1原图: 1.2结果图 2. ...
- 无人机石油巡线技术方案
石油的运输是当今石油经济中的一个重要环节,管道安全运输则是这一环节中的重点,如何保证整个管道的畅通.安全显得尤为重要.传统的人工巡线方法不仅工作量大而且条件艰苦,特别是对山区.河流.沼泽以及无人区等地 ...
- 使用Arduino Uno构建一个巡线机器人
使用Arduino Uno构建一个巡线机器人 原文 MX 巡线机器人(**LFR)**是一种简单的自主引导机器人,它遵循在地面上绘制的线来检测白色表面上的暗线或黑暗表面上的白线.在本教程中,使用 Ar ...
- 树莓派视觉小车 -- OpenCV巡线(HSL色彩空间、PID)
目录 试错 试错1:形态学处理 试错2:HSV色彩空间 基础理论 1.HSV与HSL色彩空间 2.PID调节 一.OpenCV图像处理 1.在HSL色彩空间下得到二值图 2. 对二值图形态学处理 3. ...
最新文章
- Windows python用impyla连接远程Hive数据库
- 开放下载!阿里云《深入浅出Kubernetes.pdf》
- ejb 2.0 3.0_EJB 3.1全局JNDI访问
- Linux系统基本操作(一)—光盘挂载/卸载
- java 并发变量_二、Java多线程编程 (对象及变量的并发访问)
- 【读书笔记】JavaScript高级编程(一)
- github 出现无法连接成功问题终极详解
- Android拨号盘,支持T9搜索和号码搜索
- java中ant_java ant使用详解
- C语言入门基础知识笔记
- [论文]著名会议和期刊
- 计算机组成原理试题库(含答案),计算机组成原理试题库(含答案) -
- 【Unity】超级坦克大战(十三)闯关流程:关卡界面逻辑
- 企业注销的债权债务如何处理
- mysql ndb 安装_mysql NDB的安装配置使用示例
- Fluent compiled 失败
- 《别看了,你学不会的》——Redis原理与实战(一)
- HTMLCSS 高级表格 合并单元格
- 【作业二】结对项目之需求分析与原型模型设计
- 你有张良计,我有过墙梯之策略模式
热门文章
- 垃圾回收①---概述+相关算法
- Android字体大小怎么自适应不同分辨率?
- sql线上线下数据库同步方式
- 宝马将机器架上微软 Azure,国内科技巨头也难抵汽车“诱惑”
- 从prolog到LTN,AI的逻辑推理能力1
- 2021年中国民爆行业企业经营情况及主要产品产销量分析:工业雷管、工业炸药产销量均有所下滑[图]
- 华为交换机ip地址与MAC地址绑定(全局/接口模式)
- 点特征直方图(PFH)描述(Point Feature Histograms (PFH) descriptors)
- 计算机指令长度是固定的,第四次作业 指令系统 设计算机A有60条指令,指令操作码6位固定长度...
- 【English】十月英语总结