项目辅导 Project-Based Learning

Sarah是市游泳队的成员。她利用暑假时间在国家游泳集训中心给教练帮忙。日前,世界大多数国家都使用视频录像的方式分析游泳运动员的训练情况。诸如澳大利亚等发达国家已经启用了先进的智能教练系统,自动根据摄像头和可穿戴设备等实时得出训练数据和反馈。而中国目前还做不到这一点,需要人工来对视频进行标记。一些关键的节点和动作环节还需要一帧帧的慢进比对,是一项耗时耗力的工作。那么是否有更好的解决方案呢?

工具

C++语言

C++是一种通用编译型高级计算机语言,同时提供面向过程和面向对象的编程特性。C++保留了其前身C语言的绝大部分功能,因而提供了与底层硬件直接交互的手段。同时,其也是一门高效的现代编程语言,在桌面程序、服务器应用、高性能应用和大型游戏等方面均有用武之地。

OpenCV


OpenCV是一个原本由英特尔俄国研究中心开发的实时计算机图形学函数库。目前,OpenCV是最有影响力的跨平台开源图像处理工具,可以实现导航、人机交互、手势识别、增强现实、人脸识别、运动追踪等先进功能。

Microsoft Visual Studio


Visual Studio是微软公司的集成开发环境(integrated development environment),用于Windows平台上的软件开发。目前,Visual Studio主要支持C++,C#,Visual Basic等语言的开发、调试和部署。Visual Studio为个人开发者提供免费的社区版本可供下载

原理

RGB颜色空间与HSV颜色空间

我们都知道视频是一连串图片的组合,而图片是以矩形排列的一系列颜色点的组合,专业术语称为像素(pixel)。对于计算机而言,所有的信息都是以数值的形式存储的,像素也不例外。当然,事实上有至少一打不同的储存颜色的方案或模型,我们称之为颜色空间(color space)。

对于一般人而言,最好理解的颜色空间是RGB,即是红(Red)绿(Green)蓝(Blue)三原色的组合。我们所有电子设备的彩色显示屏也是基于这种原理工作的,通过三原色不同强度的搭配以组合出千变万化的色彩。但是对于计算机图形学而言,一个更方便的颜色空间是HSV,即色相(Hue)饱和度(Saturation)明度(Value)。色相是色彩的基本属性,直接对应着整个色谱。饱和度是指颜色的纯度,值越大颜色越纯,反之则变灰。明度是指色彩的明亮程度。下图的圆柱直观展示了HSV颜色空间。

通过一个不太复杂的算数公式,两个颜色空间可以互相转换。那么我们为什么在这里要用到HSV呢?如果掌握一些线性代数知识的话会能很方便的解释。事实上,RGB到HSV是一个线性空间的旋转,把本来均匀分布在三个通道中我们所感兴趣的颜色特征信息一一抽取出来,以方便我们更好的操控和处理。如果从实践出发来讲,我们需要利用OpenCV提供的滑块条(trackbar)来减小干扰并最大化覆盖识别区域。调整HSV是有很明确的顺序的,先调H就能迅速的定下大范围,然后再接着S和V。但是如果是RGB的话,基本上调哪个可能都差不多,这就不太方便了。

图像处理算法

侵蚀(erode)与膨胀(dilate)


erode函数必要的参数有三个,分别是输入图形、输出图形和核心(kernel,这是一个数学概念。通俗讲可以理解成画笔的笔刷大小形状)。erode的作用,就是当且仅当输入图形的像素周围能完全覆盖核心时,才保留该像素,否则则把像素从图形中抹去。这样事实上造成的效果就是,如果输入图形还没有核大,就会整个被抹掉。如果输入图形本身比较大,周围则要被切掉一圈。


dilate其实是erode的反操作,函数所接受的参数核erode相同。dilate则是只要核心能沾上一点输入图形的边,核心所覆盖的范围就都在输出图形里。事实上造成的效果就是,输入图形要被扩大一圈。

在我们自己的应用里,使用了一次侵蚀和两次膨胀。侵蚀是希望把微小的噪点直接抹去,而膨胀则是希望把水线整体连接起来,减小后续操作的运算复杂程度。这些操作也在一定程度上稳定了识别点,让它不会因为一些噪点或者抖动而满画面乱飞。当然,目前这个还是有很大的优化空间。

寻找轮廓(findContours)

findContours必要的参数有五个,分别是输入图形、储存轮廓的二维数组、轮廓之间的包含/并列关系(hierarchy),专业术语称为图像拓扑结构(image topology)、工作模式和近似方法。

当然我们这边其实用了一个最简单的方法来寻找分界点——我们只是在过滤掉一部分目标区域以外的元素后,在红水线所有的轮廓里面找最左边的值。这个同样有非常大的优化空间,比如我们该怎样利用一下拓扑结构信息来分别同时识别出上下两根水线甚至是多根水线的分界点呢?

示例

上图展示了项目源码实际执行的场景。最上面第一个黑白窗口识别出了红色的水线,第二个黑白窗口识别出了黄色的水线。最下面显示原始视频的窗口用准星标注出了两色水线的分界点。

思考

  1. 目前来说,视频分析的工作是在个人电脑上进行的。是否可以进一步把相关程序集成到平板乃至智能手机应用中,在游泳场馆里一步完成实时的录像和分析?
  2. 为了提高视频识别的精确度。在录像时我们能进行哪些改进,比如特殊的水线,运动员泳帽的颜色,亦或是对手持录像设备用户的一些引导以确保录制视频的质量?另一方面,目前识别的算法能否能继续改进,排除可能的干扰元素、抖动和噪点?
  3. 我们已经对视频中的元素进行了识别分析,那么怎样较为精确的把视频中的坐标体系换算成现实物理世界中的各项运动数据?仅通过视频我们能够提取哪些数据?在辅以可穿戴设备的基础上,我们还能取得哪些数据?通过这些数据,我们能进行怎样的分析?
  4. 假定我们已经针对每位运动员收集了完备的训练档案。通过运动员之间的比较,和某位运动员当前数据与历史数据的比较,能得出哪些的结论?对训练有何帮助?