碼農也來玩奧運開幕式“超級變變變”!相機動捕,實時轉換賽事圖標,項目開源可試玩
大家都有在看奧運會嗎?
根據發稿前的數據統計,目前中國金牌數量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頭顯的輸入方式,或許可以進一步提升聽障人士溝通效率。
當然,我們也十分期待高橋這種腦洞大開的項目。
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。