树莓派+OpenCV追踪小球
OpenCV是一个基于BSD许可发现的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS等操作系统上,它轻量级而且高效,由一系列C函数和少量C++类构成,同时提供了Python、Java、Matlab等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV在以下领域有着广泛的应用:
- 物体识别
- 人机互动
- 图像分割
- 人脸识别
- 动作识别
- 运动跟踪
- 机器人
- 运动分析
- 机器视觉
- 结构分析
- 汽车安全驾驶
本文主要介绍使用树莓派如何通过摄像头识别颜色,以及实现通过二自由度云台来识别跟踪圆球。主要涉及到的硬件有:
- 树莓派3B+
- 500万像素CSI接口摄像头
- 二自由度舵机云台
- PAC9685舵机驱动模块
- 杜邦线若干
树莓派安装OpenCV库参考: Install OpenCV 4 on your Raspberry Pi
安装玩OpenCV之后,测试一下是否正常:
1 | workon cv |
正常情况下输出如下:
1 | '4.4.0' |
安装好摄像头之后,需要启用摄像头,通过执行rasp-config选择camera启动,启动之后重启树莓派。可以通过raspivid
和raspistill
操作摄像头,捕捉视频片段或图像,捕捉到的视频需要通过mplayer播放。也可以使用motion实时查看摄像头内容,如何配置motion本文略。
接下来我们使用OpenCV来测试摄像头,如下python代码:
1 | import numpy as np |
颜色空间
在介绍如何通过OpenCV识别颜色之前,先介绍一下色彩空间(color space)的概念,色彩空间又称为”色域”,每种色彩空间都有自己的色彩模型,OpenCV主要涉及到两种颜色空间:RGB和HSV。
RGB颜色空间以R(red)、G(green)、B(blue)三种颜色为基础,计算机中,每个像素由三个值表示:red、green、blue,每个值范围0-255。例如计算机显示的纯蓝色,RGB表示为(0,0,255)。OpenCV中默认的色彩空间是RGB颜色空间,但是顺序是BGR。
HSV(Hue, Saturation, Value)是根据颜色的直观特性,由A. R. Smith在1978年创建的一种颜色空间,也称六角锥体模型(Hexcone Model)。色调H用角度度量,取值范围为0°~360°,S表示饱和度,也就是色彩的深浅度(0-100%) ,V表示色彩的亮度(0-100%) 。
从人眼分辨的角度来看,HSV颜色空间更容易区分不同颜色,opencv也是使用HSV来进行物体识别。
BGR转换为HSV
以下是来自Color Detection in Python with OpenCV这篇文章的一段转换代码,保存文件为bgr_hsv_converter.py:
1 | import sys |
这个脚本以BRG值作为参数,输出为一个HSV颜色范围,用于物体识别。有如下颜色的一个球,BGR为(23 136 109):
执行转换:
1 | python bgr_hsv_converter.py 23 136 109 |
输出一个HSV颜色范围,这个值将在下文用于识别上图中的球体:
1 | Lower bound is : |
颜色识别
上文已经获取到了小球的颜色区域,下面这段代码将识别到小球并对小球进行颜色遮罩(mask),代码来自Color Detection in Python with OpenCV:
1 | import cv2 |
遮罩(mask)后的效果:
追踪小球
接下来这段代码是通过摄像头来追踪小球,并且会画出一条小球运动的轨迹,了解详情可阅读 Ball Tracking with OpenCV 这篇文章:
1 | from collections import deque |
确定小球坐标
以下代码用来确定小球在窗口的坐标,用于下文追踪小球确定是否偏离中心点,使用600 * 450分辨率:
1 | # import the necessary packages |
效果如下:
追踪小球
通过上节获取到小球的坐标,如果小球坐标便宜窗口中心超出一定范围,就驱动舵机转动摄像头,代码如下:
1 | # import the necessary packages |
效果如下:
本文主要参考Automatic Vision Object Tracking,代码有做些改进调整。