【工程与计算机】为游泳运动员打造智能教练

近年来,美国大学的计算机(Computer Science, CS)和电子工程(Electrical Engineering, EE)专业录取要求随着申请人数的增加逐渐水涨船高。但另一方面,国内的相关工程教育却基本是缺位的。为了弥补这种差距,陈欣老师在过去的几年里,通过我们的规划项目辅导了一批学员。通过身体力行的学习利用专业知识解决生活中的问题,他们走出了自己的舒适区。事实证明,学校对这份努力也是相当认可的。

为了帮助到更多的人,陈欣老师在此整理一些往年的成功项目经验,并同简化过的项目源代码一道与大家分享。希望能够抛砖引玉,给同学们一些思路和帮助,为之后的申请助一臂之力。毕竟短期看,CS/EE是在美国本土就业的捷径,能够较为迅速的收回教育投资;长远看,CS/EE的相关技能也能在诸多行业里起到点石成金之效。

问题

AADPS的一位学员是市游泳队的成员。她利用暑假时间在国家游泳集训中心给教练帮忙。日前,世界大多数国家都使用视频录像的方式分析游泳运动员的训练情况。诸如澳大利亚等发达国家已经启用了先进的智能教练系统,自动根据摄像头和可穿戴设备等实时得出训练数据和反馈。而中国目前还做不到这一点,需要人工来对视频进行标记。一些关键的节点和动作环节还需要一帧帧的慢进比对,是一项耗时耗力的工作。在这上面花了两三周之后,我们的学员感觉确实是一个挑战。

那么是否有更好的解决方案呢?

工具

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)、工作模式和近似方法。

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

示例


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

为了正常运行示例,需要安装OpenCV(可以在源码目录里直接下载)和Visual Studio Community 2015。然后需要按指示把OpenCV的安装目录设置为环境变量。

源码本身已经完成了额外的设置。但是具体说来是这么几项:

  • 额外的OpenCV C++头文件包含目录
  • 额外的OpenCV静态库目录
  • 链接静态库opencv_world320.lib/opencv_world320d.lib,分别对应release和debug
  • 动态链接库opencv_world320.dll/opencv_world320d.dll置于程序目录中,同时还有opencv_ffmpeg320_64.dll用于视频解码

思考

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

以上就是我们今天分享的案例,欢迎大家登陆网站后下载项目源码,通过实践来加深理解。简单的疑问可以评论在文章下,陈欣老师将会在有空时予以解答。如果对我们的服务项目感兴趣,希望获取陈欣老师一对一指导的,可以加上小助手微信号aadps1。

重要通知

本文为AADPS原创,原始发布地址是https://aadps.net/2018/9965.html。我们每年夏季会更新最新美国大学本科申请文书题目和权威院校指南,欢迎把网站加入浏览器收藏夹。

因屡次出现我们学员家长将盗用我方的推文发到我们自己的服务群里,严重影响了AADPS的正常经营秩序。AADPS决定禁止对我们专业资讯的一切形式转载或再利用(包括但不限于同行或留学生家长在任何媒体平台的公众号、资讯号、私人号中非法利用我方内容)。一经发现,我方将可能采用一切合法手段维权,恕不另行通知,创业不易,望谅解。

发布者

陈 欣

陈 欣

AADPS创始人

发表评论