码农也来玩奥运开幕式“超级变变变”!相机动捕,实时转换赛事图标,项目开源可试玩

简介: 码农也来玩奥运开幕式“超级变变变”!相机动捕,实时转换赛事图标,项目开源可试玩

大家都有在看奥运会吗?

根据发稿前的数据统计,目前中国金牌数量24,位列第一,奖牌总数51,仅次于美国的59,位列第二。

在为运动员们加油助威的同时,我们不妨再回顾一下本届奥运会开幕式。

7月23日,东京时间晚上8点,延期一年的东京奥运会终于开幕,本应座无虚席可容纳6.8万人的看台上,因防疫需要几乎空无一人。

在开幕仪式上,最让人惊喜的节目之一便是将日本老牌节目《超级变变变》的风格搬运到了各个项目图标中,表演者们相互配合,用道具搭配肢体动作,展现了乒乓球、射击、铁人三项等50个图标。

其实,在1964年的东京奥运会上,日本人就首次发明了体育项目图标,随后这也逐渐成为奥运会的传统之一,得以延续。

借着奥运热潮,不少象形文字项目也受到了关注。

比如,日本一位叫做高桥的嵌入式工程师就亲自开发了一个软件,通过相机捕捉动作和姿势,然后把它们变成奥运风格的象形动图,就像这样:

最终识别效果如下图所示,文摘菌只能说,都是“动作不够,机器来凑”啊。

手把手教你把自己变成象形动图

目前,该项目已经在GitHub上开源了。
GitHub链接:
https://github.com/Kazuhito00/Tokyo2020-Pictogram-using-MediaPipe

首先,我们需要创建一个GitHub的存储库。

$ git clone https://github.com/Kazuhito00/Tokyo2020-Pictogram-using-MediaPipe.git
$ cd Tokyo2020-Pictogram-using-MediaPipe

然后,需要创建一个Python虚拟环境,并安装所需要的库。

$ python -m venv .venv
$ source .venv/bin/activate
$ pip install mediapipe opencv-python

准备工作做完之后,可能会遇到在本地代码无效的情况,可以对VideoCapture的宽度和高度适当做出调整。

  • parser.add_argument("--width", help='cap width', type=int, default=640)
  • parser.add_argument("--height", help='cap height', type=int, default=360)
  • parser.add_argument("--width", help='cap width', type=int, default=960)
  • parser.add_argument("--height", help='cap height', type=int, default=540)

随后就可以运行该项目了。

$ python main.py

这时候你就会发现,相机识别出来的图变成了这个样子:

最后,高桥也大方地给出了试玩地址,感兴趣的同学可别错过了:
试玩地址:
https://pictogram-san.com/

象形动图升级:霹雳舞也能玩出花!

这么有意思的项目仅限于此未免有些可惜了。

于是,一位叫做岩田智哉的同学就对高桥的程序进行了进一步的改进和完善,比如说,用来跳霹雳舞。

由于身体机能的下降,岩田放弃了在转动摄像机时实时制作象形图,转而尝试通过让程序读取视频,来制作象形图。

考虑到这点后,他做出了如下修改,把程序改成了由命令行参数传递的视频文件的象形图,同时还删除了反转视频的逻辑。

  • parser.add_argument("--device", type=int, default=0)
  • parser.add_argument('--file', type=str, required=True, help="video file path")
    parser.add_argument("--width", help='cap width', type=int, default=960)
    parser.add_argument("--height", help='cap height', type=int, default=540)

@@ -43,7 +43,7 @@ def main():

 # 引数解析 #################################################################
 args = get_args()

  • cap_device = args.device
  • cap_file = args.file
    cap_width = args.width
    cap_height = args.height

@@ -55,7 +55,7 @@ def main():

 rev_color = args.rev_color


 # カメラ準備 ###############################################################
  • cap = cv.VideoCapture(cap_device)
  • cap = cv.VideoCapture(cap_file)
    cap.set(cv.CAP_PROP_FRAME_WIDTH, cap_width)
    cap.set(cv.CAP_PROP_FRAME_HEIGHT, cap_height)

@@ -86,7 +86,7 @@ def main():

     ret, image = cap.read()
     if not ret:
         break
  • image = cv.flip(image, 1) # ミラー表示
  • image = cv.flip(image, 1) # ミラー表示

    debug_image01 = copy.deepcopy(image)
    debug_image02 = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)
    cv.rectangle(debug_image02, (0, 0), (image.shape[1], image.shape[0]),

然后就能得到这样的视频识别效果:

最后,岩田表示,既然都做到这一步了,我们就顺理成章地再添加逻辑,把这个栩栩如生的视频保存为一个单独的mp4文件。

第一次加载作为命令行参数传递的视频文件时,需要创建一个文件名为<UTC时间戳>-pictgram-output.mp4的视频文件,并在每次循环后添加一个进程来导出象形图象即可。

!/usr/bin/env python

# -- coding: utf-8 --
import copy
+from datetime import datetime
import math
import argparse

@@ -79,6 +80,8 @@ def main():

     color = (100, 33, 3)
     bg_color = (255, 255, 255)

  • is_first = True
  • output_video = None
    while True:

    display_fps = cvFpsCalc.get()
    

@@ -86,6 +89,7 @@ def main():

     ret, image = cap.read()
     if not ret:
         break

+

     #image = cv.flip(image, 1)  # ミラー表示
     debug_image01 = copy.deepcopy(image)
     debug_image02 = np.zeros((image.shape[0], image.shape[1], 3), np.uint8)

@@ -125,7 +129,18 @@ def main():

     cv.imshow('Tokyo2020 Debug', debug_image01)
     cv.imshow('Tokyo2020 Pictogram', debug_image02)

  • if is_first:
  • fmt = cv.VideoWriter_fourcc('m', 'p', '4', 'v')
  • fps = cap.get(cv.CAP_PROP_FPS)
  • now = datetime.now().strftime('%Y-%m-%d-%H%M%S')
  • output_video = cv.VideoWriter(f'{now}-pictgram-output.mp4', fmt, fps, (debug_image02.shape[1], debug_image02.shape[0]))
  • is_first = False

+

  • output_video.write(debug_image02)

+

 cap.release()
  • if output_video:
  • output_video.release()
    cv.destroyAllWindows()

基于机器学习技术的手势识别算法MediaPipe

据了解,高桥所使用的为谷歌开源机器学习工具“MediaPipe”。

MediaPipe是一种基于机器学习技术的手势识别算法,其特点是准确率高,支持五指和手势追踪,可根据一帧图像推断出单手21个立体节点。

与目前市面上较先进的手势识别技术相比,MediaPipe不需要依赖台式机,在手机上就能进行实时追踪,还支持同时追踪多只手,识别遮挡等。

MediaPipe框架有3个模型组成,包括:手掌识别模型BlazePalm(用于识别手的整体框架和方向)、Landmark模型(识别立体手部节点)、手势识别模型(将识别到的节点分类成一系列手势)。

其中,BlazePalm是一个可识别单帧图像的模型,主要为Landmark模型提供准确剪裁的手掌图像,在经过训练后手掌识别准确率可达95.7%。这大大降低了对旋转、转化和缩放等数据增强方式的依赖,让算法将更多计算能力用在提高预测准确性上。

此外,BlazePalm可识别多种不同手掌大小,还能识别手部遮挡,并且能通过对手臂、躯干或个人特征等的识别来准确定位手部。

Landmark模型在BlazePalm基础上识别到的21个立体节点坐标,这些节点之间的位置遮挡也可被识别。

通过手势识别模型,从Landmark提取的数据来推断每根手指伸直或弯曲等动作,接着将这些动作与预设的手势匹配,以预测基础的静态手势。预设手势包括美国、欧洲、中国通用手势,以及竖大拇指、握拳、OK、“蜘蛛侠”等。

对于MediaPipe,更为主流是将其作为手语识别和翻译的辅助方式,如果再结合AR/VR头显的输入方式,或许可以进一步提升听障人士沟通效率。

当然,我们也十分期待高桥这种脑洞大开的项目。

相关文章
|
存储 缓存 前端开发
如何优化 SSR 应用以减少服务器压力
优化SSR应用以减少服务器压力,可采用代码分割、缓存策略、数据预加载、服务端性能优化、使用CDN、SSR与SSG结合、限制并发请求、SSR与CSR平滑切换、优化前端资源及利用框架特性等策略。这些方法能有效提升性能和稳定性,同时保证用户体验。
472 4
|
10月前
|
机器学习/深度学习 人工智能 监控
鸿蒙赋能智慧物流:AI类目标签技术深度解析与实践
在数字化浪潮下,物流行业面临变革,传统模式的局限性凸显。AI技术为物流转型升级注入动力。本文聚焦HarmonyOS NEXT API 12及以上版本,探讨如何利用AI类目标签技术提升智慧物流效率、准确性和成本控制。通过高效数据处理、实时监控和动态调整,AI技术显著优于传统方式。鸿蒙系统的分布式软总线技术和隐私保护机制为智慧物流提供了坚实基础。从仓储管理到运输监控再到配送优化,AI类目标签技术助力物流全流程智能化,提高客户满意度并降低成本。开发者可借助深度学习框架和鸿蒙系统特性,开发创新应用,推动物流行业智能化升级。
353 1
|
存储 算法 Java
深入理解Java内存管理
本文将通过通俗易懂的语言,详细解析Java的内存管理机制。从JVM的内存结构入手,探讨堆、栈、方法区等区域的具体作用和原理。进一步分析垃圾回收机制及其调优方法,最后讨论内存泄漏的常见场景及防范措施。希望通过这篇文章,帮助读者更好地理解和优化Java应用的内存使用。
|
物联网 应用服务中间件 Linux
CentOS7.9 Nginx+EMQX集群组建MQTTS平台
通过以上步骤,您已成功搭建了一个基于CentOS 7.9、Nginx和EMQX的MQTTS平台。这个平台既能保证数据传输的安全性,又能利用Nginx的负载均衡能力和EMQX的高性能、高并发处理能力,实现稳定高效的消息服务。在部署和配置过程中,务必注意证书、域名以及EMQX配置的正确性,确保系统安全和稳定运行。此外,定期更新软件和系统,以及监控系统性能,也是保证MQTTS平台长期稳定运行的重要环节。
462 4
|
11月前
|
人工智能 自然语言处理 搜索推荐
阿里云 AI 搜索开放平台集成 DeepSeek 模型
阿里云 AI 搜索开放平台最新上线 DeepSeek -R1系列模型。
533 2
|
安全 搜索推荐 5G
移动应用与系统:构建未来数字世界的双引擎####
本文探讨了移动应用开发与移动操作系统之间的紧密联系,揭示了它们如何共同推动着数字经济的蓬勃发展。文章首先概述了当前移动应用市场的繁荣景象及其对日常生活的深刻影响,随后深入剖析了移动操作系统作为基础平台的关键技术特性与发展趋势。通过案例分析,阐述了跨平台开发工具的兴起、人工智能技术的融合以及5G时代下移动应用的新机遇。最后,强调了开发者在把握行业趋势、注重用户体验及数据安全方面的重要性,为读者描绘了一个既充满挑战又孕育无限可能的未来图景。 ####
|
监控 算法 Java
深入理解Java虚拟机:JVM调优的实用策略
在Java应用开发中,性能优化常常成为提升系统响应速度和处理能力的关键。本文将探讨Java虚拟机(JVM)调优的核心概念,包括垃圾回收、内存管理和编译器优化等方面,并提供一系列经过验证的调优技巧。通过这些实践指导,开发人员可以有效减少延迟,提高吞吐量,确保应用稳定运行。 【7月更文挑战第16天】
242 4
|
JavaScript
Vue3标签(Tag)
这是一个Vue组件`Tag.vue`,提供了多样化的标签展示功能。支持设置标签颜色、尺寸、图标、边框等样式,并可实现标签的动态添加与删除。
327 2
Vue3标签(Tag)
|
开发者 Python
Python 时间处理与时区转换:深入探究 datetime、time 模块与 pytz 库的功能与应用
Python 时间处理与时区转换:深入探究 datetime、time 模块与 pytz 库的功能与应用
429 0
|
机器学习/深度学习 计算机视觉 网络架构
是VGG网络的主要特点和架构描述
是VGG网络的主要特点和架构描述:
432 1