pid摄像头循迹(opencv和openmv)
用摄像头进行循迹的方法参考
去年用openmv做了一个循迹小车,效果还不错,实验室里做了汇报,这里也同步分享一下制作的一些细节。
小车灰常简陋,当时硬件水平有限,轻喷>_<
csdn视频放不出来,只能放已经投稿的视频,这里就不展示了叭。
运行效果其实和openmv官方教程给的视频里小车效果类似,大家可以作为参考。
硬件选型方面
- 稳压模块x2
- 9v锂电池x1
- openmv
- 减速电机(6v 280rpm)
- 万向轮
- L298N直流电机驱动模块
(插一下,这里的稳压可以稳压到7V和3.3V,L298N本身可以将电压稳压到5V)
软件思路
如上图所示,分为图像预处理、线性拟合以及PID控制转速。
一.图像预处理:
1.按阈值取二值化 (可以加入中值滤波或高斯滤波)
2.腐蚀操作 (去除噪点)
3.膨胀操作(可有可无)
因为openmv的算力有限,若是同时加上了膨胀和腐蚀操作,运行循迹程序时帧率会变得很低(可能低于15fps)。
代码部分
图像预处理在openmv和opencv中均有现成的库函数,直接调用即可。
1.openmv:
img.dilate(2) #膨胀
img.erode(2)# 腐蚀
img = sensor.snapshot().binary([THRESHOLD]) # 按阈值二值化
2.opencv:
mask=cv2.inRange(img,black_min,black_max) #二值化
kernel=np.ones((3,3),np.uint8) #半径大小
erode=cv2.morphologyEx(mask,cv2.MORPH_ERODE,kernel)# 腐蚀
腐蚀膨胀 示意图如下所示:
二.线性拟合
这里的线性拟合采用的是最小二乘法进行拟合,遍历所有像素点,复杂度为O(n²)
openmv有现成的库函数:
line = img.get_regression([(100,100,0,0,0,0)], robust = True)
官网给的解释是快速鲁棒线性回归
可以直接返回得到拟合的直线对象
参考文档:https://docs.singtown.com/micropython/zh/latest/openmvcam/library/omv.image.html?highlight=get_regression#image.get_regression
官方文档介绍:
opencv线性拟合:
由于我没有找到相关的线性拟合函数,于是自己写了一个函数:
传入参数img为二值化图像,result为原图。
# 线性拟合
def liner(img,result):
# print(img)
n=[len(img[: