博客專欄

EEPW首頁 > 博客 > 碼農(nóng)也來玩奧運開幕式“超級變變變”!相機動捕,實時轉(zhuǎn)換賽事圖標,項目開源可試玩

碼農(nóng)也來玩奧運開幕式“超級變變變”!相機動捕,實時轉(zhuǎn)換賽事圖標,項目開源可試玩

發(fā)布人:大數(shù)據(jù)文摘 時間:2021-08-07 來源:工程師 發(fā)布文章

大家都有在看奧運會嗎?

根據(jù)發(fā)稿前的數(shù)據(jù)統(tǒng)計,目前中國金牌數(shù)量24,位列第一,獎牌總數(shù)51,僅次于美國的59,位列第二。

在為運動員們加油助威的同時,我們不妨再回顧一下本屆奧運會開幕式。

7月23日,東京時間晚上8點,延期一年的東京奧運會終于開幕,本應(yīng)座無虛席可容納6.8萬人的看臺上,因防疫需要幾乎空無一人。

在開幕儀式上,最讓人驚喜的節(jié)目之一便是將日本老牌節(jié)目《超級變變變》的風格搬運到了各個項目圖標中,表演者們相互配合,用道具搭配肢體動作,展現(xiàn)了乒乓球、射擊、鐵人三項等50個圖標。

其實,在1964年的東京奧運會上,日本人就首次發(fā)明了體育項目圖標,隨后這也逐漸成為奧運會的傳統(tǒng)之一,得以延續(xù)。

借著奧運熱潮,不少象形文字項目也受到了關(guān)注。

比如,日本一位叫做高橋的嵌入式工程師就親自開發(fā)了一個軟件,通過相機捕捉動作和姿勢,然后把它們變成奧運風格的象形動圖,就像這樣:

1.gif

最終識別效果如下圖所示,文摘菌只能說,都是“動作不夠,機器來湊”啊。

2.gif3.gif

手把手教你把自己變成象形動圖

目前,該項目已經(jīng)在GitHub上開源了。

4.png

GitHub鏈接:

https://github.com/Kazuhito00/Tokyo2020-Pictogram-using-MediaPipe

首先,我們需要創(chuàng)建一個GitHub的存儲庫。

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

然后,需要創(chuàng)建一個Python虛擬環(huán)境,并安裝所需要的庫。

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

準備工作做完之后,可能會遇到在本地代碼無效的情況,可以對VideoCapture的寬度和高度適當做出調(diào)整。

-    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

這時候你就會發(fā)現(xiàn),相機識別出來的圖變成了這個樣子:

5.png

最后,高橋也大方地給出了試玩地址,感興趣的同學可別錯過了:

6.png

試玩地址:

https://pictogram-san.com/

象形動圖升級:霹靂舞也能玩出花!

這么有意思的項目僅限于此未免有些可惜了。

于是,一位叫做巖田智哉的同學就對高橋的程序進行了進一步的改進和完善,比如說,用來跳霹靂舞。

由于身體機能的下降,巖田放棄了在轉(zhuǎn)動攝像機時實時制作象形圖,轉(zhuǎn)而嘗試通過讓程序讀取視頻,來制作象形圖。

考慮到這點后,他做出了如下修改,把程序改成了由命令行參數(shù)傳遞的視頻文件的象形圖,同時還刪除了反轉(zhuǎn)視頻的邏輯。

-    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():
     # 引數(shù)解析 #################################################################
     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]),

然后就能得到這樣的視頻識別效果:

7.png

想看動圖?滿足你:

8.gif9.gif

怎么樣,是不是覺得竟然還有一絲酷炫?

最后,巖田表示,既然都做到這一步了,我們就順理成章地再添加邏輯,把這個栩栩如生的視頻保存為一個單獨的mp4文件。

第一次加載作為命令行參數(shù)傳遞的視頻文件時,需要創(chuàng)建一個文件名為<UTC時間戳>-pictgram-output.mp4的視頻文件,并在每次循環(huán)后添加一個進程來導出象形圖象即可。

#!/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()

基于機器學習技術(shù)的手勢識別算法MediaPipe

據(jù)了解,高橋所使用的為谷歌開源機器學習工具“MediaPipe”。

MediaPipe是一種基于機器學習技術(shù)的手勢識別算法,其特點是準確率高,支持五指和手勢追蹤,可根據(jù)一幀圖像推斷出單手21個立體節(jié)點。

與目前市面上較先進的手勢識別技術(shù)相比,MediaPipe不需要依賴臺式機,在手機上就能進行實時追蹤,還支持同時追蹤多只手,識別遮擋等。

10.gif

MediaPipe框架有3個模型組成,包括:手掌識別模型BlazePalm(用于識別手的整體框架和方向)、Landmark模型(識別立體手部節(jié)點)、手勢識別模型(將識別到的節(jié)點分類成一系列手勢)。

其中,BlazePalm是一個可識別單幀圖像的模型,主要為Landmark模型提供準確剪裁的手掌圖像,在經(jīng)過訓練后手掌識別準確率可達95.7%。這大大降低了對旋轉(zhuǎn)、轉(zhuǎn)化和縮放等數(shù)據(jù)增強方式的依賴,讓算法將更多計算能力用在提高預測準確性上。

此外,BlazePalm可識別多種不同手掌大小,還能識別手部遮擋,并且能通過對手臂、軀干或個人特征等的識別來準確定位手部。

Landmark模型在BlazePalm基礎(chǔ)上識別到的21個立體節(jié)點坐標,這些節(jié)點之間的位置遮擋也可被識別。

通過手勢識別模型,從Landmark提取的數(shù)據(jù)來推斷每根手指伸直或彎曲等動作,接著將這些動作與預設(shè)的手勢匹配,以預測基礎(chǔ)的靜態(tài)手勢。預設(shè)手勢包括美國、歐洲、中國通用手勢,以及豎大拇指、握拳、OK、“蜘蛛俠”等。

11.png

對于MediaPipe,更為主流是將其作為手語識別和翻譯的輔助方式,如果再結(jié)合AR/VR頭顯的輸入方式,或許可以進一步提升聽障人士溝通效率。

當然,我們也十分期待高橋這種腦洞大開的項目。

*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: AI

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉