?使用Mediapipe對圖像進(jìn)行手部地標(biāo)檢測
概述
在本文中,我們將以深度庫即 Mediapipe為基礎(chǔ)庫,以及其他計算機(jī)視覺預(yù)處理的CV2庫來制作手部地標(biāo)檢測模型。市場上有很多關(guān)于這種問題的用例,例如商業(yè)相關(guān)的虛擬現(xiàn)實、游戲部分的實時體驗。
行業(yè)用例
1. 智能家居:這是計算機(jī)視覺的現(xiàn)代用例之一,人們使用智能家居來過上更舒適的生活,這就是為什么它不再是一個小眾領(lǐng)域,它也正在蔓延到普通家庭。
2. 智能電視:我們經(jīng)?吹竭@種用例,你可以用手勢來改變音量、改變頻道等等。
3. 游戲:對于真正的體驗,這項技術(shù)越來越多地融入互動游戲。
讓我們建立我們的手部檢測模型
導(dǎo)入庫
在這里,我們將導(dǎo)入整個管道中需要的所有庫。
import cv2
import numpy as np
import mediapipe as mp
import matplotlib.pyplot as plt
使用 Mediapipe 初始化手的地標(biāo)檢測模型
第一步是使用有效參數(shù)初始化模型,無論我們采用哪種檢測技術(shù),它可以是Mediapipe 或Yolo,初始化模型很重要,遵循相同的原則,我們將遵循所有給定的步驟:
# First step is to initialize the Hands class an store it in a variable
mp_h(yuǎn)ands = mp.solutions.hands
# Now second step is to set the hands function which will hold the landmarks points
hands = mp_h(yuǎn)ands.Hands(static_image_mode=True, max_num_h(yuǎn)ands=2, min_detection_confidence=0.3)
# Last step is to set up the drawing function of hands landmarks on the image
mp_drawing = mp.solutions.drawing_utils
代碼分解:
1. 首先,使用mp.solutions.hands初始化變量 mp_h(yuǎn)ands。然后使用相同的變量通過mp.solutions.hands.Hands()為hands設(shè)置函數(shù)。
2. 到目前為止,我們了解了手模型初始化的結(jié)構(gòu),現(xiàn)在讓我們深入研究函數(shù)中使用的參數(shù)hands。
· static_image_mode: 該參數(shù)將布爾值作為其有效值,即它可以是True或False。當(dāng)處理視頻流時,默認(rèn)條件是 False ,這意味著它會降低處理延遲,即它會繼續(xù)專注于特定的手并定位相同的手,直到它追蹤的手消失,當(dāng)我們必須檢測實時流或視頻中的手時,這可能是有益的,根據(jù)我們的要求,我們必須檢測圖像上的地標(biāo),因此我們將值設(shè)置為True。
· max_num_h(yuǎn)ands:此參數(shù)將指示模型將在一個實例中檢測到的最大手?jǐn)?shù)。默認(rèn)情況下,該值為 2,這也是有意義的,盡管我們可以更改它,但我們希望至少檢測到一雙手。
· min_detection_confidence:它提供了置信水平的閾值。最小檢測置信度的理想范圍是 [0.0,1.0],默認(rèn)情況下,它保持為 0.5,這意味著如果置信度低于 50%,則在輸出圖像中根本不會檢測到手。
最后,我們將使用mp.solutions.drawing_utils,它將負(fù)責(zé)在輸出圖像上繪制所有手的地標(biāo),這些地標(biāo)由我們的 Hands 函數(shù)檢測到。
讀取圖像
在這里,我們將首先使用cv2.imread()讀取要在其上執(zhí)行手部檢測的圖像,并使用matplotlib庫來顯示該特定輸入圖像。
# Reading the sample image on which we will perform the detection
sample_img = cv2.imread('media/sample.jpg')
# Here we are specifing the size of the figure i.e. 10 -h(huán)eight; 10- width.
plt.figure(figsize = [10, 10])
# Here we will display the sample image as the output.
plt.title("Sample Image");plt.a(chǎn)xis('off');plt.imshow(sample_img[:,:,::-1]);plt.show()
輸出:
執(zhí)行手部地標(biāo)檢測
因此,現(xiàn)在我們已經(jīng)初始化了我們的手部檢測模型,下一步將是處理輸入圖像上的手部地標(biāo)檢測,并使用上述初始化模型在該圖像上繪制所有 21 個地標(biāo),我們將通過以下步驟。
results = hands.process(cv2.cvtColor(sample_img, cv2.COLOR_BGR2RGB))
if results.multi_h(yuǎn)and_landmarks:
for hand_no, hand_landmarks in enumerate(results.multi_h(yuǎn)and_landmarks):
print(f'HAND NUMBER: {hand_no+1}')
print('-----------------------')
for i in range(2):
print(f'{mp_h(yuǎn)ands.HandLandmark(i).name}:')
print(f'{hand_landmarks.landmark[mp_h(yuǎn)ands.HandLandmark(i).value]}')
輸出:
代碼分解:
1. 第一步,我們使用Mediapipe 庫中的process函數(shù)將手部地標(biāo)檢測結(jié)果存儲在變量results中,同時我們將圖像從 BGR 格式轉(zhuǎn)換為 RGB 格式。
2. 在進(jìn)入下一步時,我們將首先檢查一些驗證,是否檢測到點,即變量results應(yīng)該存放了一些結(jié)果。
3. 如果是,那么我們將遍歷在圖像中檢測到的具有手部地標(biāo)的所有點。
4. 現(xiàn)在在另一個循環(huán)中,我們可以看到只有 2 次迭代,因為我們只想顯示手的 2 個地標(biāo)。
5. 最后,我們將根據(jù)要求打印出所有檢測到并過濾掉的地標(biāo)。
從上面的處理中,我們發(fā)現(xiàn)所有檢測到的地標(biāo)都被歸一化為通用尺度,但是現(xiàn)在對于用戶端,這些縮放點是不相關(guān)的,因此我們會將這些地標(biāo)恢復(fù)到原始狀態(tài)。
image_h(yuǎn)eight, image_width, _ = sample_img.shape
if results.multi_h(yuǎn)and_landmarks:
for hand_no, hand_landmarks in enumerate(results.multi_h(yuǎn)and_landmarks):
print(f'HAND NUMBER: {hand_no+1}')
print('-----------------------')
for i in range(2):
print(f'{mp_h(yuǎn)ands.HandLandmark(i).name}:')
print(f'x: {hand_landmarks.landmark[mp_h(yuǎn)ands.HandLandmark(i).value].x * image_width}')
print(f'y: {hand_landmarks.landmark[mp_h(yuǎn)ands.HandLandmark(i).value].y * image_h(yuǎn)eight}')
print(f'z: {hand_landmarks.landmark[mp_h(yuǎn)ands.HandLandmark(i).value].z * image_width}n')
輸出:
代碼分解:
我們只需要在這里執(zhí)行一個額外的步驟,即我們將從我們定義的示例圖像中獲得圖像的原始寬度和高度,然后所有步驟將與我們之前所做的相同,唯一不同的將是現(xiàn)在地標(biāo)點沒有專門縮放。
在圖像上繪制地標(biāo)
由于我們已經(jīng)從上述預(yù)處理中獲得了手部地標(biāo),現(xiàn)在是時候執(zhí)行我們的最后一步了,即在圖像上繪制點,以便我們可以直觀地看到我們的手部地標(biāo)檢測模型是如何執(zhí)行的。
img_copy = sample_img.copy()
if results.multi_h(yuǎn)and_landmarks:
for hand_no, hand_landmarks in enumerate(results.multi_h(yuǎn)and_landmarks):
mp_drawing.draw_landmarks(image = img_copy, landmark_list = hand_landmarks,
connections = mp_h(yuǎn)ands.HAND_CONNECTIONS)
fig = plt.figure(figsize = [10, 10])
plt.title("Resultant Image");plt.a(chǎn)xis('off');plt.imshow(img_copy[:,:,::-1]);plt.show()
輸出:
代碼分解:
1. 首先,我們將創(chuàng)建原始圖像的副本,此步驟是出于安全目的,因為我們不想失去圖像的原創(chuàng)性。
2. 然后我們將處理之前所做的驗證工作。
3. 然后我們將遍歷手的每個地標(biāo)。
4. 最后,借助mp_drawing.draw_landmarks函數(shù),我們將在圖像上繪制地標(biāo)。
5. 是時候使用 matplotlib 繪制圖像了,所以首先,我們將給出圖形大小(此處為 width-10 和 height-10),然后在最后繪制,imshow將 BGR 格式轉(zhuǎn)換為 RGB 格式后的圖像使用函數(shù),因為對于 RGB 格式更有意義。
結(jié)論
在整個管道中,我們首先初始化模型,然后讀取圖像,查看輸入圖像,然后進(jìn)行預(yù)處理。我們縮小了地標(biāo)點,但這些點與用戶無關(guān),因此我們將其恢復(fù)到原始狀態(tài),最后我們將在圖像上繪制地標(biāo)。
原文標(biāo)題 : ?使用Mediapipe對圖像進(jìn)行手部地標(biāo)檢測
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-10.29立即報名>> 2024德州儀器嵌入式技術(shù)創(chuàng)新發(fā)展研討會
-
10月31日立即下載>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月14日立即報名>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
推薦專題
- 1 Intel宣布40年來最重大轉(zhuǎn)型:年底前裁員15000人、拋掉2/3房產(chǎn)
- 2 因美封殺TikTok,字節(jié)股價骨折!估值僅Meta1/5
- 3 宏山激光重磅發(fā)布行業(yè)解決方案,助力智能制造產(chǎn)業(yè)新飛躍
- 4 國產(chǎn)AI芯片公司破產(chǎn)!白菜價拍賣
- 5 具身智能火了,但規(guī)模落地還需時間
- 6 國產(chǎn)英偉達(dá)們,抓緊沖刺A股
- 7 三次錯失風(fēng)口!OpenAI前員工殺回AI編程賽道,老東家捧金相助
- 8 英特爾賦能智慧醫(yī)療,共創(chuàng)數(shù)字化未來
- 9 英偉達(dá)的麻煩在后頭?
- 10 將“網(wǎng)紅”變成“商品”,AI“爆改”實力拉滿
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市