1. 实现原理
对于循迹功能的实现,首先需要设置ROI(Region of Interest)区域,即是图像感兴趣区域,合理的划分ROI区域可以在一定程度上减少OpenMV的计算资源的消耗从而提高系统运行速率。
本次使用的TFT-LCD屏在QQVGA的画质下的尺寸为160120,其循迹时的ROI区域的设置如图4-4所示。如图所示,总共设置了三个ROI区域,三个区域的大小均是120pix30pix尺寸的矩形。离视野越近的地方所设置权重值应该更大,所以ROI1、ROI2和ROI3的权值大小分别为0.7、0.3和0.1。

设置好阈值后,为便于循迹,需要对图像进行灰度处理,同时设置巡线的颜色阈值。本次巡线图的颜色为黑色,设置巡线的灰度颜色阈值为(0,64)。
配置好上述参数后,视觉模块开始循迹,其循迹原理如下图所示。

首先,摄像头将得到的图像进行转换,得到对应得灰度图。
之后,寻找灰度图ROI区域中的最大黑色色块,并返回三个色块的矩形元组框出位置。如下面公式所示,将三个色块的中心点的横坐标与对应ROI区域的权值相乘再将其求和可以近似得到线的质心和。

然后,由计算出的质心和和之前设置的权值和根据下述公式可以计算出当前的线心位置CenterPos。

最后,根据线心位置和图片的像素尺寸可以通过下述公式将线心位置转换成偏角大小。

本次巡线模式使用的像素尺寸为160*120,所以本次偏角DeflectAngle的计算使用下式。

不难发现, 的取值在0到160之间,所以偏角DeflectAngle的取值范围为 ,转换为角度即DeflectAngle取值范围为正负53.1度之间。
在得到图像中黑线的偏角之后,即可进行偏角大小的判断来确定小车的动作状态。当偏角绝对值小于角度阈值时,小车直行;当偏角绝对值大于角度阈值且为正偏角时,小车右转;当偏角绝对值值大于角度阈值且为负偏角时,小车左转。
2 循迹功能实现流程图与伪码


3 代码实现
#导入函数库
import sensor, image, time, math ,lcd
from pyb import UART
#开启时钟
clock = time.clock()# 跟踪FPS帧率
#变量初始化
#阈值设置 根据实际情况进行更改
TRA_TH= [(128, 255)] #巡线的灰度值 阈值[(0, 64)][(128, 255)]
TRA_AngTH=30 #巡线时角度阈值
#ROI区域设置
#(x,y,w,h,weight)=(矩形左上顶点的坐标(x,y),矩形宽度和高度(w,h),权重)
TRA_ROIS = [ # [ROI, weight]
(0, 100, 160, 20, 0.7), # You'll need to tweak the weights for your app
(0, 50, 160, 20, 0.3), # depending on how your robot is setup.
(0, 0, 160, 20, 0.1)
]
Weight_Sum = 0 #权值和初始化
for r in TRA_ROIS: Weight_Sum += r[4] #计算权值和
OBS_ROI = [(

该文详细介绍了使用OpenMV摄像头通过设置ROI区域进行图像处理来实现循迹功能。首先设置ROI区域和颜色阈值,然后进行灰度处理,寻找最大黑色色块以确定线的质心,通过计算偏角来控制小车行驶方向。当偏角超出预设阈值时,小车执行相应的转弯或直行指令。
2万+

被折叠的 条评论
为什么被折叠?



