基于OpenCV的巡线小车多赛道识别
对摄像头拍摄到的多赛道进行检测并输出每条赛道的角度和中点坐标
运行结果:
![](/assets/blank.gif)
下面的代码都有注释
下面函数是先对整个画面进行扫描,选取合适的色块并排列得到他们的面积和对应的索引
def FindRoad():#在这里面寻找面积最大的4目标没有意义,这里我们主要用到的是没有找到目标时返回的结果area2 = []b = []Inf = -1if len(contour1) >= 1: #找到目标至少为一for i in range(len(contour1)):if cv2.contourArea(contour1[i])>50:area2.append(cv2.contourArea(contour1[i])) #将找到目标面积储存到area2if len(area2)!=0:for j in range(4): #只对前4个最大的面积进行操作b.append(area2.index(max(area2))) #把目标按照面积大小从大到小存入列表barea2[area2.index(max(area2))] = Inf #把刚刚存入列表的面积重新赋值为-1else:return 1b.sort() #因为目标赛道检测到的面积有可能并不是按照顺序排列,所以在这里进行排列return belse:return 1
设置判断赛道之间的间距,根据的是得到的赛道边缘的横坐标
def JudgeRoad(n):s = []try:if n[2]-n[1]!=n[1]-n[0]:s.append(n[1]) #列表s储存赛道边缘位置横坐标else:s.append(min(n))try:for i in range(len(n)):if n[i + 1] - n[i] >= 50: #赛道的间距>50s.append(n[i])s.append(n[i + 1])if i==len(n)-2:if n[len(n)-1] - n[len(n)-2]<5:s.append(n[len(n)-1])breakelse:s.append(n[len(n)-2])breakexcept:passreturn s #返回赛道横坐标列表except Exception :return 1 #错误时一定要返回值pass
计算赛道的角度
def calc_angle(x1,y1,x2,y2):angle = 0k = 0h = 0y = y1-y2x = x1-x2if x == 0:passelse:k = y/xh = math.atan(k)angle = 90 - abs(math.degrees(h))return angle
完整代码:
import cv2
import numpy as np
import math# cap = cv2.VideoCapture('C:/Users/K2095/Desktop/777.mp4')(这是我提前拍摄的模拟小车运行时摄像头的画面)
cap = cv2.VideoCapture(0)def FindRoad():area2 = []b = []Inf = -1if len(contour1) >= 1: #找到目标至少为一for i in range(len(contour1)):if cv2.contourArea(contour1[i])>50:area2.append(cv2.contourArea(contour1[i])) #将找到目标面积储存到area2if len(area2)!=0:for j in range(4): #只对前4个最大的面积进行操作b.append(area2.index(max(area2))) #把目标按照面积大小从大到小存入列表barea2[area2.index(max(area2))] = Inf #把刚刚存入列表的面积重新赋值为-1else:return 1b.sort() #因为目标赛道检测到的面积有可能并不是按照顺序排列,所以在这里进行排列return belse:return 1def JudgeRoad(n):s = []try:if n[2]-n[1]!=n[1]-n[0]:s.append(n[1]) #列表s储存赛道边缘位置横坐标else:s.append(min(n))try:for i in range(len(n)):if n[i + 1] - n[i] >= 50: #赛道的间距>50s.append(n[i])s.append(n[i + 1])if i==len(n)-2:if n[len(n)-1] - n[len(n)-2]<5:s.append(n[len(n)-1])breakelse:s.append(n[len(n)-2])breakexcept:passreturn s #返回赛道横坐标列表except Exception :return 1 #错误时一定要返回值passdef calc_angle(x1,y1,x2,y2):angle = 0k = 0h = 0y = y1-y2x = x1-x2if x == 0:passelse:k = y/xh = math.atan(k)angle = 90 - abs(math.degrees(h))return anglewhile True:success , img = cap.read()img = cv2.resize(img, (640, 480))imgHSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)lowerblack = np.array([0, 0, 0])upperblack = np.array([255, 255, 120])maskblack = cv2.inRange(imgHSV, lowerblack, upperblack)contour1, hierarchy1 = cv2.findContours(maskblack, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)color = maskblack[380] #遍历掩膜第380行全部像素值color2 = maskblack[420]blackindex = np.where(color == 255) #储存像素为255的索引值blackindex2 = np.where(color2 == 255)npindex = np.array(blackindex)npindex2 = np.array(blackindex2)a = npindex.ravel() #将数组维度拉成一维数组c = npindex2.ravel()FindRoad()o = FindRoad() #为赛道的索引b = JudgeRoad(a) #赛道边缘的横坐标,为偶数个b1 = [] #储存赛道中点横坐标blackindex2 = JudgeRoad(c)npindex2 = []if o == 1:print('未找到赛道')passelse:if len(str(b)) <= 1: #b类型转换成字符串(防止报错)b1.append(1)else:for i in range(len(b)):if i % 2 == 0:b1.append((b[i] + b[i + 1]) / 2)else:passif len(str(blackindex2)) <= 1:npindex2.append(1)else:for i in range(len(blackindex2)):if i % 2 == 0:npindex2.append((blackindex2[i] + blackindex2[i + 1]) / 2)else:passif len(b1)==len(npindex2):for i in range(len(b1)):angle = calc_angle(npindex2[i], 420, b1[i], 380)cv2.circle(img, (int(npindex2[i]), 420), 3, 255, -1)cv2.circle(img, (int(b1[i]), 380), 3, 255, -1)print('赛道{}角度:{},中点横坐标:{}'.format(i+1,angle,b1[i]))else:passcv2.imshow('s',maskblack)cv2.imshow('s1', img)if cv2.waitKey(30) & 0xFF == 27: # 按Esc关闭break
基于OpenCV的巡线小车多赛道识别相关推荐
- 基于opencv的巡线方案
目录 背景 实际效果: 两侧车道线效果: 单侧车道线效果: 十字路口车道线补齐 代码讲解: 基础部分: 十字路口补线: 缺点: 注意事项: 背景 在参加17届智能车百度智慧交通组竞赛的时候我脑子里就有 ...
- 基于STM32F103智能巡线小车
项目描述: 巡线小车是我作为新手入手的第一个项目,基本巡线功能是使用红外传感器循迹模块判断黑线的路径来确定转向方向,同时控制单片机配置PWM占空比波控制小车前进的L298N电机模块,实现前后退,左 ...
- 基于STC89C52RC模块的巡线小车
基于STC89C52RC模块的巡线小车 在STC89C52RC的基础上使用电机驱动使小车完成巡线,停站,避障,掉头等多功能智能小车 所需头文件: #include <reg52.h> #i ...
- stm32 电磁巡线小车
stm32 电磁巡线小车 一 可实现功能 使用陀螺仪,根据俯仰角变化在下坡后停车 . 通过三路电感,实现小车巡线,可循 s弯 ,d形弯,8字弯,环岛. 可在不同的地方巡线,有学习能力. 红外光电开关判 ...
- 巡线小车学习笔记(arduino 四路循迹)
巡线小车代码学习笔记 红外布局原理 中间两路巡线一直在黑线上,小车会直行,当任意一个出来,小车会自动纠正.如果最外面的检测到黑线.则小车以更大速度纠正到黑线上去.在算法上,优先处理锐角,直角等外围传感 ...
- Arduino案例实操 -- 智能巡防小车(三)图形化巡线小车编程
巡防小车的巡线功能同时可以用图形化编程软件来实现.博主这里用的图形化编程软件是KRobot. 三.图形化巡线小车编程 3.1 编程环境配置 3.1.1 下载编程软件 3.1.2 安装编程软件 3.2 ...
- Arduino案例实操 -- 智能巡防小车(三)Arduino IDE巡线小车编程
三.Arduino IDE巡线小车编程 3.1 Arduino开发环境 下载免安装ZIP包 下载IDE安装包 3.2 Arduino IDE 3.3 Blink项目实例 打开内置案例 进行程序上传 3 ...
- OpenMV:14巡线小车
文章目录 追小球的小车 巡线小车 这个例子展示了在OpenMV Cam上使用get_regression()方法获得ROI的线性回归.使用这种方法,可以轻松让机器人跟踪所有指向相同大致方向的线. 本例 ...
- 从零开始制作OV7670摄像头巡线小车
大家想不想自己动手制作如下一款摄像头巡线小车呢? 摄像头寻迹小车,你们想要不? 这款硬件原理图如下所示: 需要的主要材料清单有: 1.STM32F411核心板 2.OV7670摄像头 3.A4988步 ...
- 基于arduino下的巡线小车
先发代码再进行解释吧 #include <Wire.h> // Include the I2C library (required) #include "QGPMaker_IIC ...
最新文章
- 回溯算法解决迷宫问题
- 凸集 凸函数 凸优化
- 鸿蒙上海开发者日直播,华为鸿蒙 OS 开发者日于 4月17 日上海举行
- tcpdump抓取udp报文
- 7-1 寻找大富翁 (25 分)(思路加详解+两种做法(一种优先队列,一种vector容器))
- 20180828 上课截图
- 直接在 CSS 中引用 FONTAWESOME 图标(附码表)
- jtree和mysql_Jtable和JTree的写法示例代码
- js入门笔记整理(二)——操作符
- 【PL/SQL】用星号拼出金字塔
- CentOS 7安装部署zabbix3.4
- 【HDU3336】Count the String(kmp--每个前缀出现的次数)
- win10自己的计算机用户名和密码忘了,win10账号密码忘记了如何解决_win10系统账户登陆密码忘了怎么办...
- 打开其他软件时,老是弹出Xftp7安装的问题(msi报错)
- Java输入小数和整数求COSx_嗖嗖移动大厅 源代码 Java初级小项目
- matlab subs的用法,Matlab subs函數的用法
- hihocoder#1369 : 网络流算法的一些小结
- bzoj1236 KPSUM bzoj2900 好玩的数字游戏
- 利用OpenCV实现图像矫正
- JavaScript 如何计算两个日期之间的天数
热门文章
- OpenGL 数据类型
- windows不能执行打印任务
- 甜品消消乐 17 彩虹糖同色消除的算法
- 四库一平台网站的爬取
- java datetime 初始化_Java日期处理易踩的十个坑
- 迄今为止最快的小米手机, 3s
- MySQL 查询大于“时间字段”15分钟、1小时、1天的数据
- Mysql 8.0 密码管理问题,root登录修改默认密码,root无需密码或任何密码都可以登录原因及解决方法
- python使用selenium爬取股票相关信息
- php读取word文件并解析图片,PHP读取word docx文档内容及处理图片