欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

?Python使用Mediapipe對(duì)圖像進(jìn)行手部地標(biāo)檢測(cè)

 更新時(shí)間:2022年03月08日 10:39:38   作者:woshicver  
本文將以深度庫(kù)即Mediapipe為基礎(chǔ)庫(kù),以及其他計(jì)算機(jī)視覺(jué)預(yù)處理的CV2庫(kù)來(lái)制作手部地標(biāo)檢測(cè)模型,文中的示例代碼講解詳細(xì),感興趣的可以了解一下

概述

在本文中,我們將以深度庫(kù)即 Mediapipe為基礎(chǔ)庫(kù),以及其他計(jì)算機(jī)視覺(jué)預(yù)處理的CV2庫(kù)來(lái)制作手部地標(biāo)檢測(cè)模型。市場(chǎng)上有很多關(guān)于這種問(wèn)題的用例,例如商業(yè)相關(guān)的虛擬現(xiàn)實(shí)、游戲部分的實(shí)時(shí)體驗(yàn)。

行業(yè)用例

智能家居:這是計(jì)算機(jī)視覺(jué)的現(xiàn)代用例之一,人們使用智能家居來(lái)過(guò)上更舒適的生活,這就是為什么它不再是一個(gè)小眾領(lǐng)域,它也正在蔓延到普通家庭。

智能電視:我們經(jīng)常看到這種用例,你可以用手勢(shì)來(lái)改變音量、改變頻道等等。

游戲:對(duì)于真正的體驗(yàn),這項(xiàng)技術(shù)越來(lái)越多地融入互動(dòng)游戲。

讓我們建立我們的手部檢測(cè)模型

導(dǎo)入庫(kù)

在這里,我們將導(dǎo)入整個(gè)管道中需要的所有庫(kù)。

import cv2
import numpy as np
import mediapipe as mp
import matplotlib.pyplot as plt

使用 Mediapipe 初始化手的地標(biāo)檢測(cè)模型

第一步是使用有效參數(shù)初始化模型,無(wú)論我們采用哪種檢測(cè)技術(shù),它可以是Mediapipe 或Yolo,初始化模型很重要,遵循相同的原則,我們將遵循所有給定的步驟:

# First step is to initialize the Hands class an store it in a variable
mp_hands = mp.solutions.hands
 
# Now second step is to set the hands function which will hold the landmarks points
hands = mp_hands.Hands(static_image_mode=True, max_num_hands=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_hands。
  2. 然后使用相同的變量通過(guò)mp.solutions.hands.Hands()為hands設(shè)置函數(shù)。

到目前為止,我們了解了手模型初始化的結(jié)構(gòu),現(xiàn)在讓我們深入研究函數(shù)中使用的參數(shù)hands。

  • static_image_mode: 該參數(shù)將布爾值作為其有效值,即它可以是True或False。當(dāng)處理視頻流時(shí),默認(rèn)條件是 False ,這意味著它會(huì)降低處理延遲,即它會(huì)繼續(xù)專注于特定的手并定位相同的手,直到它追蹤的手消失,當(dāng)我們必須檢測(cè)實(shí)時(shí)流或視頻中的手時(shí),這可能是有益的,根據(jù)我們的要求,我們必須檢測(cè)圖像上的地標(biāo),因此我們將值設(shè)置為True
  • max_num_hands:此參數(shù)將指示模型將在一個(gè)實(shí)例中檢測(cè)到的最大手?jǐn)?shù)。默認(rèn)情況下,該值為 2,這也是有意義的,盡管我們可以更改它,但我們希望至少檢測(cè)到一雙手。
  • min_detection_confidence:它提供了置信水平的閾值。最小檢測(cè)置信度的理想范圍是 [0.0,1.0],默認(rèn)情況下,它保持為 0.5,這意味著如果置信度低于 50%,則在輸出圖像中根本不會(huì)檢測(cè)到手。

最后,我們將使用mp.solutions.drawing_utils,它將負(fù)責(zé)在輸出圖像上繪制所有手的地標(biāo),這些地標(biāo)由我們的 Hands 函數(shù)檢測(cè)到。

讀取圖像

在這里,我們將首先使用cv2.imread()讀取要在其上執(zhí)行手部檢測(cè)的圖像,并使用matplotlib庫(kù)來(lái)顯示該特定輸入圖像。

# 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 -height; 10- width.
plt.figure(figsize = [10, 10])
 
# Here we will display the sample image as the output.
plt.title("Sample Image");plt.axis('off');plt.imshow(sample_img[:,:,::-1]);plt.show()

輸出:

執(zhí)行手部地標(biāo)檢測(cè)

因此,現(xiàn)在我們已經(jīng)初始化了我們的手部檢測(cè)模型,下一步將是處理輸入圖像上的手部地標(biāo)檢測(cè),并使用上述初始化模型在該圖像上繪制所有 21 個(gè)地標(biāo),我們將通過(guò)以下步驟。

results = hands.process(cv2.cvtColor(sample_img, cv2.COLOR_BGR2RGB))
 
if results.multi_hand_landmarks:
    
   for hand_no, hand_landmarks in enumerate(results.multi_hand_landmarks):
        print(f'HAND NUMBER: {hand_no+1}')
        print('-----------------------')
        
        for i in range(2):
            print(f'{mp_hands.HandLandmark(i).name}:')
            print(f'{hand_landmarks.landmark[mp_hands.HandLandmark(i).value]}')

輸出:

代碼分解:

  1. 第一步,我們使用Mediapipe 庫(kù)中的process函數(shù)將手部地標(biāo)檢測(cè)結(jié)果存儲(chǔ)在變量results中,同時(shí)我們將圖像從 BGR 格式轉(zhuǎn)換為 RGB 格式。
  2. 在進(jìn)入下一步時(shí),我們將首先檢查一些驗(yàn)證,是否檢測(cè)到點(diǎn),即變量results應(yīng)該存放了一些結(jié)果。
  3. 如果是,那么我們將遍歷在圖像中檢測(cè)到的具有手部地標(biāo)的所有點(diǎn)。
  4. 現(xiàn)在在另一個(gè)循環(huán)中,我們可以看到只有 2 次迭代,因?yàn)槲覀冎幌腼@示手的 2 個(gè)地標(biāo)。
  5. 最后,我們將根據(jù)要求打印出所有檢測(cè)到并過(guò)濾掉的地標(biāo)。

從上面的處理中,我們發(fā)現(xiàn)所有檢測(cè)到的地標(biāo)都被歸一化為通用尺度,但是現(xiàn)在對(duì)于用戶端,這些縮放點(diǎn)是不相關(guān)的,因此我們會(huì)將這些地標(biāo)恢復(fù)到原始狀態(tài)。

image_height, image_width, _ = sample_img.shape
 
if results.multi_hand_landmarks:
 
    for hand_no, hand_landmarks in enumerate(results.multi_hand_landmarks):
        
        print(f'HAND NUMBER: {hand_no+1}')
        print('-----------------------')
        
        for i in range(2):    
            print(f'{mp_hands.HandLandmark(i).name}:') 
            print(f'x: {hand_landmarks.landmark[mp_hands.HandLandmark(i).value].x * image_width}')
            print(f'y: {hand_landmarks.landmark[mp_hands.HandLandmark(i).value].y * image_height}')
            print(f'z: {hand_landmarks.landmark[mp_hands.HandLandmark(i).value].z * image_width}n')

輸出:

代碼分解:

我們只需要在這里執(zhí)行一個(gè)額外的步驟,即我們將從我們定義的示例圖像中獲得圖像的原始寬度和高度,然后所有步驟將與我們之前所做的相同,唯一不同的將是現(xiàn)在地標(biāo)點(diǎn)沒(méi)有專門縮放。

在圖像上繪制地標(biāo)

由于我們已經(jīng)從上述預(yù)處理中獲得了手部地標(biāo),現(xiàn)在是時(shí)候執(zhí)行我們的最后一步了,即在圖像上繪制點(diǎn),以便我們可以直觀地看到我們的手部地標(biāo)檢測(cè)模型是如何執(zhí)行的。

img_copy = sample_img.copy()
 
if results.multi_hand_landmarks:
 
    for hand_no, hand_landmarks in enumerate(results.multi_hand_landmarks):
        
        mp_drawing.draw_landmarks(image = img_copy, landmark_list = hand_landmarks,
                                  connections = mp_hands.HAND_CONNECTIONS)
    fig = plt.figure(figsize = [10, 10])
 
    plt.title("Resultant Image");plt.axis('off');plt.imshow(img_copy[:,:,::-1]);plt.show()

輸出:

代碼分解:

  1. 首先,我們將創(chuàng)建原始圖像的副本,此步驟是出于安全目的,因?yàn)槲覀儾幌胧D像的原創(chuàng)性。
  2. 然后我們將處理之前所做的驗(yàn)證工作。
  3. 然后我們將遍歷手的每個(gè)地標(biāo)。
  4. 最后,借助mp_drawing.draw_landmarks函數(shù),我們將在圖像上繪制地標(biāo)。
  5. 是時(shí)候使用 matplotlib 繪制圖像了,所以首先,我們將給出圖形大?。ù颂帪?width-10 和 height-10),然后在最后繪制,imshow將 BGR 格式轉(zhuǎn)換為 RGB 格式后的圖像使用函數(shù),因?yàn)閷?duì)于 RGB 格式更有意義。

結(jié)論

在整個(gè)管道中,我們首先初始化模型,然后讀取圖像,查看輸入圖像,然后進(jìn)行預(yù)處理。我們縮小了地標(biāo)點(diǎn),但這些點(diǎn)與用戶無(wú)關(guān),因此我們將其恢復(fù)到原始狀態(tài),最后我們將在圖像上繪制地標(biāo)。

尾注

這是本文的 github 鏈接:https://github.com/Aman-Preet-Singh-Gulati/hands-landmarks-detection-mediapipe

到此這篇關(guān)于Python使用Mediapipe對(duì)圖像進(jìn)行手部地標(biāo)檢測(cè)的文章就介紹到這了,更多相關(guān)Python Mediapipe手部地標(biāo)檢測(cè)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python基礎(chǔ)之列表常見(jiàn)操作經(jīng)典實(shí)例詳解

    Python基礎(chǔ)之列表常見(jiàn)操作經(jīng)典實(shí)例詳解

    這篇文章主要介紹了Python基礎(chǔ)之列表常見(jiàn)操作,結(jié)合實(shí)例形式詳細(xì)分析了Python列表創(chuàng)建方式、內(nèi)置函數(shù)與相關(guān)使用技巧,需要的朋友可以參考下
    2020-02-02
  • python中List添加與刪除元素的幾種方法實(shí)例

    python中List添加與刪除元素的幾種方法實(shí)例

    列表基本上是?Python?中最常用的數(shù)據(jù)結(jié)構(gòu)之一了,并且刪除操作也是經(jīng)常使用的,下面這篇文章主要給大家介紹了關(guān)于python中List添加與刪除元素的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • python計(jì)算牛頓迭代多項(xiàng)式實(shí)例分析

    python計(jì)算牛頓迭代多項(xiàng)式實(shí)例分析

    這篇文章主要介紹了python計(jì)算牛頓迭代多項(xiàng)式的方法,涉及Python數(shù)學(xué)運(yùn)算的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • Python編程使用有限狀態(tài)機(jī)識(shí)別地址有效性

    Python編程使用有限狀態(tài)機(jī)識(shí)別地址有效性

    這篇文章主要介紹了Python編程中如何使用有限狀態(tài)機(jī)識(shí)別地址有效性,如何識(shí)別一個(gè)地址是否有效,確切的講,如何編程識(shí)別一個(gè)中國(guó)地址是否有效
    2021-09-09
  • pygame游戲之旅 添加游戲界面按鍵圖形

    pygame游戲之旅 添加游戲界面按鍵圖形

    這篇文章主要為大家詳細(xì)介紹了pygame游戲之旅的第10篇,教大家如何添加游戲界面按鍵圖形,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • python爬蟲之生活常識(shí)解答機(jī)器人

    python爬蟲之生活常識(shí)解答機(jī)器人

    這篇文章主要介紹了python爬蟲之生活常識(shí)解答機(jī)器人,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-04-04
  • 關(guān)于python xlwings模塊用法詳解

    關(guān)于python xlwings模塊用法詳解

    xlwings是一個(gè)用于在Excel和Python之間進(jìn)行交互的庫(kù),它允許您使用Python操作Excel文件,包括讀取和寫入數(shù)據(jù),運(yùn)行宏,設(shè)置格式等等,我們可以使用xlwings來(lái)處理Excel文件中的數(shù)據(jù),執(zhí)行各種操作,所以本文小編就給大家python xlwings模塊用法
    2023-09-09
  • Python利用heapq實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列的方法

    Python利用heapq實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列的方法

    今天小編就為大家分享一篇Python利用heapq實(shí)現(xiàn)一個(gè)優(yōu)先級(jí)隊(duì)列的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-02-02
  • python中溫度單位轉(zhuǎn)換的實(shí)例方法

    python中溫度單位轉(zhuǎn)換的實(shí)例方法

    在本篇文章里小編給大家整理關(guān)于python中溫度單位轉(zhuǎn)換的實(shí)例方法,有需要的朋友們可以學(xué)習(xí)參考下。
    2020-12-12
  • Python編碼類型轉(zhuǎn)換方法詳解

    Python編碼類型轉(zhuǎn)換方法詳解

    這篇文章主要介紹了Python編碼類型轉(zhuǎn)換方法,結(jié)合實(shí)例形式詳細(xì)分析了Python針對(duì)各種常見(jiàn)編碼的轉(zhuǎn)碼與解碼等操作技巧,需要的朋友可以參考下
    2016-07-07

最新評(píng)論