前言

以前制作智能车都是在STM32上制作的,学习了一点OpenCV想要实践一下,一下就想到了买来一直在吃灰的树莓派,做一个智能小车吧!

黑线识别

我们先在Windows上写出基本能跑的检测代码:
首先我先用画图绘制了一张理想的跑道图片

在读取并且进行二值化后:

img = cv2.imread('sd0.png')#读取图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转为灰度图
retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)# 大津法二值化


理想情况真的很理想~(笑哭哈哈)
我们先检测一条线上的情况,为了小车能够更早的检测到偏移并且做出反应,我们选择靠近图像顶部1/5处的直线作为检测对象(如图黑线):

我们将中心初始化为图像的中心

rows,cols,channels = img.shape#获取图像尺寸
center = int(cols/2)#初始位置中心点处

然后我们在中心的附近进行黑线的寻找,在找到中心黑线后中心黑线的中心点即为新的中心位置!
总体代码如下:

import cv2
import numpy as np#图像预处理
img = cv2.imread('sd0.png')#读取图片
rows,cols,channels = img.shape#获取图像尺寸
center = int(cols/2)#初始位置中心点处
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转为灰度图
retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)# 大津法二值化
#确定位置
h1 = dst[int(rows*4/5)]# 找到4/5处
cv2.line(img,(0,int(rows*1/5)),(cols,int(rows*1/5)),(0,0,0),1,cv2.LINE_AA)#画辅助线
l_post = r_post = center#从上次中心点开始寻找边界
if h1[center] == 0:#未偏离黑线#寻找黑线边界while h1[l_post] == 0:l_post = l_post - 1while h1[r_post] == 0:r_post = r_post + 1
else:#偏离黑线#寻找黑线while h1[l_post] == 255:l_post = l_post - 1while h1[r_post] == 255:r_post = r_post + 1if (center - l_post) < (r_post - center):#黑线在左边r_post = l_postwhile h1[l_post] == 0:l_post = l_post - 1else:#黑线在右rl_post = r_postwhile h1[r_post] == 0:r_post = r_post + 1
center = (r_post + l_post)/2#确定位置
#确定中心点标记
cv2.circle(img,(int(center),int(rows*1/5)), 5, (0,0,255), -1)
#显示效果
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

但是我在换了一张图片后识别失败了!

分析了一波原因,感觉是二值化后左边的深蓝色区域也变为黑色,并且距离中心位置更近,导致错误检测。但是如果在开始对正,连续行驶的情况下应该问题不大(其实是不知道咋办了~)!

import cv2
import RPi.GPIO as gpio
import time
import numpy as np# 定义引脚
sg = 12
moto1 = 13
moto2 = 15
moto3 = 16
moto4 = 18
# 设置GPIO口为BOARD编号规范
gpio.setmode(gpio.BOARD)
# 设置GPIO口为输出
gpio.setup(sg, gpio.OUT)
gpio.setup(moto1, gpio.OUT)
gpio.setup(moto2, gpio.OUT)
gpio.setup(moto3, gpio.OUT)
gpio.setup(moto4, gpio.OUT)
# 设置PWM波,频率为500Hz
sg_pwm = gpio.PWM(sg, 50)
moto1_PWM = gpio.PWM(moto1, 50)
moto2_PWM = gpio.PWM(moto2, 50)
moto3_PWM = gpio.PWM(moto3, 50)
moto4_PWM = gpio.PWM(moto4, 50)
# pwm波控制初始化
#0.9-1.5-2.1
sg_pwm.start(1.5*100/20)
moto1_PWM.start(0)
moto2_PWM.start(0)
moto3_PWM.start(30)
moto4_PWM.start(30)cap = cv2.VideoCapture(0)
print(cap.isOpened())
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)center = center_temp = 320 #初始位置中心点处
while(True):ret, img = cap.read()#获取图像#img = cv2.blur(img,(5,5))gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转为灰度图 retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)# 大津法二值化kernel = np.ones((5,5),np.uint8)#closingclosing = cv2.morphologyEx(dst,cv2.MORPH_CLOSE,kernel)#确定位置h1 = closing[int(480/2)]# 找到1/2处# 找到黑色的像素点个数black_count = np.sum(h1 == 0)# 找到黑色的像素点索引black_index = np.where(h1 == 0)if black_count != 0:center_temp = (black_index[0][black_count - 1] + black_index[0][0]) / 2if (abs(center_temp - center) > 150):passelse:center = center_temp#change dutyduty = (center - 320)*0.015 + 1.5*100/20if duty > 2.1*100/20:duty = 2.1*100/20elif duty < 0.9*100/20:duty = 0.9*100/20sg_pwm.ChangeDutyCycle(duty)#cv2.line(img,(0,int(480/2)),(640,int(480/2)),(0,0,0),1,cv2.LINE_AA)#画辅助线#cv2.circle(img,(int(center),int(480/2)), 5, (0,0,255), -1)#显示效果#cv2.imshow("img",closing)if cv2.waitKey(1) & 0xFF == ord('q'):#监测到键盘输入q关闭break
cap.release()#释放摄像头
cv2.destroyAllWindows()#关闭窗口
pwm1.stop()
moto3_PWM.ChangeDutyCycle(0)
moto4_PWM.ChangeDutyCycle(0)
moto3_PWM.stop()
moto4_PWM.stop()
gpio.cleanup()

硬件

机械上面直接在网上买来了一个成品的车模~

就这样的,电池盒是后面放上去的,想要用三节18650达到12V左右的电压。

电路上先用模块搭一下,电源出来12V电压使用 LM2596S-5.0V 的稳压到5v给树莓派供电(之前手上有L7805,两块并联都不行,发烫导致树莓派不断重启),再用 LM2596S-adj 可调版本的给舵机供电,和电源连接上一个显示电压的数码管,方便检测电压及时充电。
电机驱动买了一个现成的模块,如图小红板。

买了一个超大的12V风扇放在电路顶端,给树莓派、稳压、电机驱动等的散热。
摄像头直接用的树莓派摄像头。

OpenCV + 树莓派制作智能车【1】相关推荐

  1. 利用树莓派制作智能音箱

    制作智能音箱需要解决的问题,如下: 需要准备的器件(例如音箱.麦克风等) 代码实现问题(语音交互) 语音识别 语音唤醒功能 能够实现播放.暂停音乐(预先设好的音乐/链接网址播放在线) 讲故事.讲笑话( ...

  2. 使用树莓派制作智能小车

    电影里,时不时地可以看到一些这样的场景,一辆小车,上面装有摄像头,这辆小车可以通过电脑或都是手机进行远程遥控,车上摄像头拍到的画面,可以实时地显示在电脑或手机上,就像下图这样. 没有接触过这方面的朋友 ...

  3. 自写app与树莓派制作智能小车

    实现的功能有: 1.实现小车的前进,后退,左转,右转. 2.实时视频的传回,查看小车周围的情况. 3.摄像头的上下左右转动,使用舵机云台来实现. 需要的材料: 1.树莓派一个(带有python环境,现 ...

  4. 智能车竞赛技术报告 | 智能车视觉 - 中国计量大学 - 赛博-10

    学 校:中国计量大学 队伍名称:赛博-10    参赛队员:陈 峰      洪晨辰    毛华斐    带队教师:金小萍    陈东晓    第一章 引言 ■ 1.1 概述   全国大学生智能汽车竞 ...

  5. 智能车竞赛技术报告 | 智能车视觉 - 南京邮电大学 - 栅库砸车跑路队

    学 校:南京邮电大学  队伍名称:删库砸车跑路队 参赛队员:刘乐      孙锐      甘翠      带队教师:江兵      刘烨      第一章 方案设计   本章主要介绍智能汽车系统总体 ...

  6. 智能车竞赛技术报告 | 智能车视觉 - 天津大学 - 北洋钽星

    简 介: 全国大学生智能汽车竞赛以"立足培养.重在参与.鼓励探索.追求卓越"为宗旨.本文介绍的AI视觉智能车结合了图像处理.神经网络.PID控制.机械设计等技术,实现了省赛国赛的比 ...

  7. 智能车竞赛技术报告 | 智能车视觉 - 西安邮电大学 - AI小布丁

    学 校:西安邮电大学     队伍名称:AI小布丁       参赛队员:张展鹏 徐军其 杜博林 带队教师:亢红波 蔡秀梅                第一章 引言   全国大学生智能车竞赛是从 2 ...

  8. 智能车竞赛技术报告 | 智能车视觉 - 中南林业科技大学 - 弃车人队

    简 介: 本文根据第十六届智能车大赛的要求,经过在实验室的不断调试,研究并设出了拥有自主循迹功能及数字和物种识别功能的以摄像头传感器为主导的 AGV实体.在循迹算法上,为了加快小车对赛道信息的采集速度 ...

  9. 智能车竞赛技术报告 | 智能车视觉 -重庆大学 - 风林火山

    简 介: 本文主要介绍了基于RT Thread操作系统的智能视觉组四轮循迹智能小车系统的原理.软硬件设计以及小车制作过程,对小车的系统介绍包括车模机械结构的设计.模块电路的设计.传感器信号的处理.控制 ...

最新文章

  1. 规格选择_Axure教程:实现商品规格选择功能
  2. java 树 右键菜单_VUE实现Studio管理后台(八):用右键菜单contextmenu,编辑树形结构...
  3. Java——方法(练习九九乘法表)
  4. MIX08,迎来Silverlight2的新时代
  5. 转mjpeg协议到httpflv
  6. java 任务池_多线程的应用-异步任务线程池的简单实现
  7. RS报内存错误XQE-ROL-0183
  8. Python实现微信自动抠图换底助手
  9. Flutter格式化电话号码
  10. Linux 系统升级蝉道
  11. 向量积(叉积)和数量积(点积)的区别和联系之解析
  12. 新年贺卡用python_Photoshop 一张简洁的新年贺卡制作方法
  13. 聚合数据左磊:不走寻常路 做国内最好的数据聚合平台
  14. 云计算学习笔记——第四章 存储虚拟化
  15. java.lang.ClassNotFoundException: org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEnd
  16. QT Creator 7 如何同时运行多个客户端窗口(Client)
  17. 配置Druid数据源监控
  18. php添加学生信息,PHP开发 学生管理系统之添加信息PHP页面
  19. 勤奋,不足以让你过上好日子
  20. 浅谈共享充电器电路板构造及充电原理

热门文章

  1. PSCAD自动化库mhrc.automation安装及使用
  2. 改变千万人生的一堂课(第四篇 职业精神)
  3. 树莓派安装Windows for ARM
  4. python画简笔画病毒_用Python做一个可以自动转换JPG格式图片成简笔画的软件
  5. percona-xtrabackup备份示例完全备份和增量备份
  6. 前端人真实项目中遇到的问题总结
  7. [C++ Primer Plus]输入、输出和文件
  8. 订货管理数据库 查询
  9. Boost.Asio,libevent和ACE之间关于Socket编程的比较(★firecat推荐★)
  10. 项目经理责任制核心要点之一:明确项目经理的责权利