背景
2016年5月15日左右,我刚完成编程之美挑战赛,就和李丁义组团参加大工电子设计竞赛。这本是一个纯硬件的比赛,我们却选择用软件的方法去解决硬件的问题。扯上了Android端,借助Android端的摄像头,依靠视频图像识别完成了小球的位置识别与跟踪过程。然后发位置信息给硬件端,硬件去做控制。在这个比赛里,我负责Android端的编写,李丁义负责硬件部分,两个端采用蓝牙进行交互。
创新之处
1、概述
这个赛题的目的很简单,就是用任意方法感知小球的位置,并且基于此对导轨进行控制,使导轨上的小球到达到达目标位置。我们选择的方法就是用图像识别,用红绿两色标出导轨的左右端点,小球涂成黑色。在摄像头看来,那就变成了红色、黑色、绿色的平均位置的相对位置关系。我在屏幕上设计了三个框,于是我只对三个框中的颜色信息进行采集与跟踪,假设两帧之间各颜色移动的距离很小,各颜色在一帧内不会移出框,并且每帧都把框锁定到指定颜色的中心位置,这样可以一直保持跟踪。
2、实现
我们开发了Android手机上的BallTracking软件实现了小球位置的识别,信息传送,限位警报的播放等功能。
小球位置的识别采用视频检测的方法,由Android手机完成。Android手机摆放在小球滚动控制系统前方1m处,手机后方的摄像头采集视频数据,经软件处理后实时得到小球的位置。小球位置信息通过蓝牙实时发送至stm32单片机。并且判断小球是否已到达导轨两端,若是,通过手机上的扬声器播放限位警报。另外,软件还可以通过蓝牙向stm32单片机发送控制指令,接收并显示stm32单片机实时回传的数据。
Android端具体实现
1、小球位置的识别
下面介绍BallTracking软件如何从视频数据中实时获取小球的位置信息。软件依赖OpenCV库,OpenCV是基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在多种操作系统上。BallTracking软件基于OpenCV Android SDK,使用OpenCV java API进行开发。
在软件开发期间,经过多种识别算法的实验和分析,我们最终采用了矩形区域内颜色块检测的方法确定小球位置。我们对实验装置做如下预处理:导轨长60cm,在导轨左右两端各画一个红色标记,用于标定0与60cm处的导轨位置。并将小球涂黑。
在软件中,当用户点击屏幕时,软件自动拾取点击处的颜色信息,并生成一个固定大小的矩形跟踪框。软件即开始获取矩形跟踪框中与该颜色相似到一定程度的像素点,并对这些像素点求质心,该质心坐标就是被跟踪物的坐标,并且成为该跟踪框的新中心坐标,由此实现跟踪框的自动跟踪。我们分别识别出了导轨左侧、导轨右侧、小球三者在1920X1080视频上的坐标,经过一定的坐标转换,可以得出小球在导轨上的位置坐标。该跟踪算法对颜色均一的物体识别和跟踪效果较好。
在某手机上实测,在摄像头广角不是很严重的情况下,小球位置的识别精度可以达到1mm。最主要误差来源是手机摄像头的透视误差。在跟踪过程中,小球位置的抖动振幅在0.5mm至2mm不等。
在另一手机上实测时,发现该手机摄像头的广角比较严重,由此造成小球在导轨两端时,位置信息的识别误差达到6mm左右。此时最主要误差来源变为广角镜头造成的畸变误差,有必要对广角进行修正。于是加入广角修正模式,对位置信息进行处理后,识别精度可以达到1mm。
软件界面大致如图,上面的蓝字里含有位置信息,下面的黄字是硬件端通过蓝牙回传的信息,左边是一组操纵按键,画面中间的三个框是跟踪框。
2、 Android端完整代码
|
|