基于创意之星AI控制器的自主巡线功能,通过摄像头采集图像,通过颜色识别要跟随的线条,根据识别结果对四轮小车进行运动控制,实现小车沿着线自主行驶。
由于巡线的功能还是基于颜色识别,因此请先完成颜色是别的实验,再进行此实验
本实验代码位于创意之星AI处理器内,up_cyzx_demo文件夹内,cyzx_follow_line_qt.py。
对于颜色的框选方法等,还是与之前的颜色识别一样。
需要关注的核心代码如下:
h, w, d = src.shape
search_top = 4*h//5
search_bot = h
mask_color[0:search_top, 0:w] = 0
mask_color[search_bot:h, 0:w] = 0
self.mask_color = mask_color
# 求截取区域的代数中心,并在此中心画一个cross来代表它
M = cv2.moments(mask_color)
if M['m00'] > 0:
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
cv2.circle(result, (cx, cy), 3, (0, 0, 255), 3) # 标记圆
err = cx - w/2
linear_x = 256
angular_z = -int(err)
left_wheel_speed = linear_x - angular_z * 3
right_wheel_speed = linear_x + angular_z * 3
if(self.enable_move):
self.movement.move_and_rotate(left_wheel_speed, right_wheel_speed)
我们通过类似前面颜色阈值二值化的方法,将线条的颜色框选出来,并且为了排除其他同类颜色干扰,设定只跟踪图像4/5到5/5的区域。
然后我们通过计算这个区域的中心,来计算小车的运动方向,最后通过控制左右轮的速度,来实现小车的自主巡线。
这里求取线条区域的中心,使用 OpenCV 的cv2.moments()函数来计算给定图像(mask_color)的矩。
矩可以提供关于图像形状的各种属性信息,比如图像的重心、面积等。
if M['m00'] > 0:
这里检查计算得到的零阶矩(m00)是否大于 0。零阶矩通常表示图像的面积,如果面积大于 0,说明图像中存在非零区域,即可以观测到带跟踪的线条。
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
如果条件满足,即图像中有非零区域,那么计算图像的中心坐标。m10除以m00得到图像重心的 x 坐标(cx),m01除以m00得到图像重心的 y 坐标(cy)。
err = cx - w/2
linear_x = 256
angular_z = -int(err)
left_wheel_speed = linear_x - angular_z * 3
right_wheel_speed = linear_x + angular_z * 3
线条的颜色中心,减去摄像头图像中心,即可作为左右轮子速度的差值,根据这个速度来对小车进行控制。
最后,我们通过控制左右轮的速度,来实现小车的自主巡线。
演示视频如下: