0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用MediaPipe Pose構(gòu)建一個(gè)俯臥撐計(jì)數(shù)器

科技觀察員 ? 來(lái)源:circuitdigest ? 作者:Ashish Choudhary ? 2022-07-28 17:16 ? 次閱讀

由于最近虛擬現(xiàn)實(shí)和增強(qiáng)現(xiàn)實(shí)的增長(zhǎng)和普及,人體姿態(tài)估計(jì)技術(shù)變得越來(lái)越流行。在我們之前的教程中,我們使用了 Media pipe Hand Tracking 模塊來(lái)使用手勢(shì)控制 Raspberry Pi 媒體播放器。在這個(gè)項(xiàng)目中,我們將使用MediaPipe Pose 估計(jì)包來(lái)構(gòu)建一個(gè)俯臥撐。我們將使用姿勢(shì)估計(jì)包來(lái)獲取肩膀和肘部的坐標(biāo)。肩部坐標(biāo)將與肘部坐標(biāo)進(jìn)行比較。因此,如果肩膀與肘部處于同一水平或低于肘部,則將被視為俯臥撐。我們還將揚(yáng)聲器連接到 Raspberry Pi 以告知俯臥撐的計(jì)數(shù)。

俯臥撐計(jì)數(shù)所需的組件

樹(shù)莓派 4

Pi 相機(jī)模塊

揚(yáng)聲器

在這里,我們只需要安裝了 OpenCV 和 MediaPipe 的 Raspberry Pi 4 和 Pi 攝像頭模塊。 OpenCV 用于 數(shù)字圖像處理,而 MediaPipe 用于 Pose 估計(jì)。數(shù)字圖像處理最常見(jiàn)的應(yīng)用是 物體檢測(cè)、 人臉識(shí)別和 人數(shù)統(tǒng)計(jì)。

什么是媒體管道?

MediaPipe是一個(gè)框架,用于構(gòu)建跨平臺(tái)(即 AndroidiOS、Web、邊緣設(shè)備)多模式(即視頻、音頻或任何時(shí)間序列數(shù)據(jù))應(yīng)用機(jī)器學(xué)習(xí)管道,包括快速 ML 推理、經(jīng)典計(jì)算機(jī)視覺(jué)和媒體處理(例如視頻解碼)。MediaPipe 發(fā)布了各種預(yù)構(gòu)建的 Python 和其他語(yǔ)言包,例如:

物體檢測(cè)

人臉檢測(cè)

手部追蹤

姿勢(shì)估計(jì)

多手追蹤

頭發(fā)分割

MediaPipePython 包可用于 Linux、macOS 和 Windows 的 PyPI。使用以下命令在 Raspberry Pi 4 上安裝 MediaPipe:

須藤 pip3 安裝 mediapipe-rpi4

如果您沒(méi)有 Pi 4,則可以使用以下命令將其安裝在 Raspberry Pi 3 上:

須藤 pip3 安裝 mediapipe-rpi3

安裝 OpenCV

在安裝 OpenCV 和其他依賴(lài)項(xiàng)之前,Raspberry Pi 需要完全更新。使用以下命令將 Raspberry Pi 更新到其最新版本:

sudo apt-get 更新

然后使用以下命令安裝在 Raspberry Pi 上安裝 OpenCV 所需的依賴(lài)項(xiàng)。

sudo apt-get install libhdf5-dev -y 
sudo apt-get install libhdf5-serial-dev –y 
sudo apt-get install libatlas-base-dev –y 
sudo apt-get install libjasper-dev -y 
sudo apt-get install libqtgui4 –y 
sudo apt-get install libqt4-test –y

之后,使用以下命令在您的 Raspberry Pi 上安裝 OpenCV。

pip3 安裝 opencv-contrib-python==4.1.0.25

為上推計(jì)數(shù)器編程 Raspberry Pi

文檔末尾給出了使用 OpenCV 上推計(jì)數(shù)器的完整代碼。在這里,我們將解釋代碼的重要部分以便更好地解釋。

通過(guò)導(dǎo)入 OpenCV 和 MediaPipe 包來(lái)啟動(dòng)代碼。如前所述,MediaPipe 是 Pose 估計(jì)的核心包,而 OpenCV 用于圖像處理。

導(dǎo)入簡(jiǎn)歷2
將媒體管道導(dǎo)入為 mp

在接下來(lái)的幾行中,我們創(chuàng)建了兩個(gè)新變量。第一個(gè)是mp_drawing,它將用于從 MediaPipe Python 包中獲取所有繪圖實(shí)用程序,第二個(gè)是mp_pose,用于導(dǎo)入姿勢(shì)估計(jì)模型。

mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose

之后,定義一個(gè)名為findPosition() 的函數(shù)。顧名思義,它用于查找所有身體標(biāo)志的 X、Y 坐標(biāo),如肩膀、眼睛等。所有標(biāo)志的坐標(biāo)將存儲(chǔ)在名為lmList[]的變量中。

def findPosition(圖像,繪制=真):
  lmList = []
  如果結(jié)果.pose_landmarks:
      mp_drawing.draw_landmarks(
         圖像,results.pose_landmarks,mp_pose.POSE_CONNECTIONS)
      對(duì)于 id, lm in enumerate(results.pose_landmarks.landmark):
          h, w, c = image.shape
          cx, cy = int(lm.x * w), int(lm.y * h)
          lmList.append([id, cx, cy])
  返回 lmList

然后從 Raspberry Pi 攝像頭開(kāi)始視頻流。您甚至可以使用預(yù)先錄制的視頻,而不是使用實(shí)時(shí)流。為此,將“0”替換為視頻路徑。

上限 = cv2.VideoCapture(0)
#cap = cv2.VideoCapture(“我的視頻.mp4”)

然后在下一行,為 mediapipe feed 設(shè)置一個(gè)新實(shí)例,以訪問(wèn)我們之前導(dǎo)入的姿勢(shì)估計(jì)模型。我們還傳遞了兩個(gè)關(guān)鍵字參數(shù),即最小檢測(cè)置信度和最小跟蹤置信度。接下來(lái),我們將讀取視頻幀并將它們存儲(chǔ)在 image 變量中。

以 mp_pose.Pose(min_detection_confidence=0.7, min_tracking_confidence=0.7) 作為姿勢(shì):

  而 cap.isOpened():
     成功,圖像 = cap.read()
     圖像 = cv2.resize(圖像, (1280, 720))

我們從視頻源獲得的圖像最初是 BGR 格式。S,在這一行中,我們將首先將圖像水平翻轉(zhuǎn)以供稍后的自拍視圖顯示,然后將BGR圖像轉(zhuǎn)換為RGB。

圖像 = cv2.cvtColor(cv2.flip(圖像, 1), cv2.COLOR_BGR2RGB)

之后,我們將通過(guò)姿勢(shì)估計(jì)模型傳遞圖像以進(jìn)行檢測(cè)并將結(jié)果存儲(chǔ)在一個(gè)名為“結(jié)果”的變量中。然后我們將 BGR 圖像轉(zhuǎn)換為 RGB。

結(jié)果=姿勢(shì).過(guò)程(圖像)
圖像 = cv2.cvtColor(圖像,cv2.COLOR_BGR2RGB)

現(xiàn)在我們得到了檢測(cè)結(jié)果,我們將調(diào)用findPosition()函數(shù)在圖像上繪制這些檢測(cè),并使用我們之前導(dǎo)入的繪圖實(shí)用程序連接所有檢測(cè)。

mp_drawing.draw_landmarks(圖像,results.pose_landmarks,mp_pose.POSE_CONNECTIONS)

之后,我們會(huì)將所有檢測(cè)的 id 和坐標(biāo)存儲(chǔ)在一個(gè)名為 lmList 的變量中。

lmList = findPosition(圖像,繪制=真)

然后在接下來(lái)的幾行中,我們將首先獲取兩個(gè)肩膀的坐標(biāo),然后在上面畫(huà)圓。如下圖所示,左右肩的 id 分別為 12 和 11。

pYYBAGLiU3aAPr2ZAALbCygmyCo696.png

如果 len(lmList) != 0:

      cv2.circle(圖像, (lmList[12][1], lmList[12][2]), 20, (0, 0, 255), cv2.FILLED)
      cv2.circle(圖像, (lmList[11][1], lmList[11][2]), 20, (0, 0, 255), cv2.FILLED)
      cv2.circle(圖像, (lmList[12][1], lmList[12][2]), 20, (0, 0, 255), cv2.FILLED)
      cv2.circle(圖像, (lmList[11][1], lmList[11][2]), 20, (0, 0, 255), cv2.FILLED)

現(xiàn)在,當(dāng)我們找到肩膀的坐標(biāo)時(shí),我們將把這些坐標(biāo)與兩個(gè)肘部的坐標(biāo)進(jìn)行比較。所以,如果肩膀與肘部在同一水平或在肘部以下,我們將階段設(shè)置為“向下”,當(dāng)肩膀在肘部以上時(shí),階段將變?yōu)橄蛏希@將被視為俯臥撐.

      如果(lmList[12][2] 和 lmList[11][2] >= lmList[14][2] 和 lmList[13][2]):
        cv2.circle(圖像, (lmList[12][1], lmList[12][2]), 20, (0, 255, 0), cv2.FILLED)
        cv2.circle(圖像, (lmList[11][1], lmList[11][2]), 20, (0, 255, 0), cv2.FILLED)
        階段=“下降”
      if (lmList[12][2] and lmList[11][2] <= lmList[14][2] and lmList[13][2]) and stage == "down":
        階段=“向上”
        計(jì)數(shù)器 += 1
        打?。ㄓ?jì)數(shù)器)

現(xiàn)在,隨著俯臥撐的計(jì)數(shù),我們將使用cv2.putText() 在視頻流上打印俯臥撐計(jì)數(shù)。

text = "{}:{}".format("俯臥撐", counter)
    cv2.putText(圖像, 文本, (10, 40), cv2.FONT_HERSHEY_SIMPLEX,
                1, (255, 0, 0), 2)
    cv2.imshow('MediaPipe 姿勢(shì)', image)

最后,我們將視頻流保存在我們的項(xiàng)目文件夾中。

    如果創(chuàng)建是無(wú):
      fourcc = cv2.VideoWriter_fourcc(*'XVID')
      create = cv2.VideoWriter(opname,fourcc, 30, (image.shape[1], image.shape[0]), True)
    create.write(圖像)

測(cè)試上推計(jì)數(shù)器腳本

現(xiàn)在 Push Up 計(jì)數(shù)器腳本已準(zhǔn)備就緒,讓我們繼續(xù)測(cè)試它。有兩種測(cè)試方法。您可以使用預(yù)先錄制的視頻,也可以使用 Pi 相機(jī)進(jìn)行實(shí)時(shí)視頻流。在這里,我們將使用 Pi 攝像頭模塊,因此,將 Raspberry Pi 攝像頭模塊與 Pi 連接,如下所示:

poYBAGLiU3GAGyLjAAWQK_s986M552.png

現(xiàn)在,檢查 Pi 相機(jī)是否正常工作。查看相機(jī)后,啟動(dòng) python 腳本,您會(huì)發(fā)現(xiàn)彈出一個(gè)窗口,其中包含您的視頻源。最初做俯臥撐時(shí),肩膀上的點(diǎn)將是紅色:

pYYBAGLiU22AFxJFAAYLSWKkCgg804.png

當(dāng)肩膀低于肘部時(shí),點(diǎn)將從紅色變?yōu)榫G色,俯臥撐計(jì)數(shù)將增加一。

pYYBAGLiU2aAVasbAAWRmbXSh-E573.png

這就是您可以使用 MediaPipe 計(jì)算俯臥撐的方法。您還可以使用此庫(kù)來(lái)計(jì)算仰臥起坐或任何其他鍛煉。下面給出了完整的工作視頻和代碼。

代碼

import cv2

import mediapipe as mp

import os

mp_drawing = mp.solutions.drawing_utils

mp_pose = mp.solutions.pose

counter = 0

stage = None

create = None

opname = “output.avi”

def findPosition(image, draw=True):

lmList = []

if results.pose_landmarks:

mp_drawing.draw_landmarks(

image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)

for id, lm in enumerate(results.pose_landmarks.landmark):

h, w, c = image.shape

cx, cy = int( lm.x * w), int(lm.y * h)

lmList.append([id, cx, cy])

#cv2.circle(image, (cx, cy), 5, (255, 0, 0), cv2.填充)

返回 lmList

cap = cv2.VideoCapture(0)

與 mp_pose.Pose(

min_detection_confidence=0.7,

min_tracking_confidence=0.7) 作為姿勢(shì):

而 cap.isOpened():

成功,image = cap.read()

image = cv2.resize(image, (640,480))

if not success:

print(“Ignoring empty camera frame.”)

# 如果加載視頻,使用 ‘break’ 而不是 ‘continue’。

continue

# 水平翻轉(zhuǎn)圖像以供稍后的自拍視圖顯示,并將

# BGR 圖像轉(zhuǎn)換為 RGB。

image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)

# 為了提高性能,可選擇將圖像標(biāo)記為不可寫(xiě)入

# 通過(guò)引用傳遞。

results = pose.process(image)

# 在圖像上繪制姿態(tài)標(biāo)注。

image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

lmList = findPosition(image, draw=True)

if len(lmList) != 0:

cv2.circle(image, (lmList[12][1], lmList[12] [2]), 20, (0, 0, 255), cv2.FILLED)

cv2.circle(image, (lmList[11][1], lmList[11][2]), 20, (0, 0, 255), cv2.FILLED)

cv2.circle(image, (lmList[12][1], lmList[12][2]), 20, (0, 0, 255), cv2.FILLED)

cv2.circle(image , (lmList[11][1], lmList[11][2]), 20, (0, 0, 255), cv2.FILLED)

if (lmList[12][2] 和 lmList[11][2] 》= lmList[14][2] 和 lmList[13][2]):

cv2.circle(image, (lmList[12][1], lmList[12][2]), 20, (0, 255, 0), cv2.FILLED)

cv2.circle(image, (lmList[11][ 1], lmList[11][2]), 20, (0, 255, 0), cv2.FILLED)

stage = “down”

if (lmList[12][2] and lmList[11][2] 《= lmList[14][2] 和 lmList[13][2]) 和 stage == “down”:

stage = “up”

counter += 1

counter2 = str(int(counter))

print(counter)

os.system( “echo ‘” + counter2 + “’ | festival --tts”)

text = “{}:{}”.format(“Push Ups”, counter)

cv2.putText(image, text, (10, 40), cv2 .FONT_HERSHEY_SIMPLEX,

1, (255, 0, 0), 2)

cv2.imshow(‘MediaPipe Pose’, image)

如果 create 為 None:

fourcc = cv2.VideoWriter_fourcc(*‘XVID’)

create = cv2.VideoWriter(opname,fourcc, 30, (image.shape[1], image.shape[0]), True)

create.write(image)

key = cv2 .waitKey(1) & 0xFF

# 如果 `q` 鍵被按下,則退出循環(huán)

if key == ord(“q”):

break

# 做一些清理

cv2.destroyAllWindows()

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 揚(yáng)聲器
    +關(guān)注

    關(guān)注

    29

    文章

    1307

    瀏覽量

    63084
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2256

    瀏覽量

    94699
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    構(gòu)建個(gè)4位二進(jìn)制計(jì)數(shù)器

    構(gòu)建個(gè)4位二進(jìn)制計(jì)數(shù)器,計(jì)數(shù)范圍從0到15(包括0和15),計(jì)數(shù)周期為16。同步復(fù)位輸入時(shí),將
    的頭像 發(fā)表于 12-02 09:20 ?5192次閱讀

    倫敦街頭的“俯臥撐”巴士

    ` 近日,捷克藝術(shù)家David?。茫澹颍睿O(shè)計(jì)并制造了輛會(huì)做俯臥撐的雙層大巴。它是由倫敦街頭的經(jīng)典雙層巴士改造而成,在倫敦奧運(yùn)會(huì)期間它被擺放在捷克奧運(yùn)代表團(tuán)總部外,最后張圖片您可以看到,
    發(fā)表于 08-07 12:01

    計(jì)數(shù)器的級(jí)連使用

    計(jì)數(shù)器的級(jí)連使用 個(gè)十進(jìn)制計(jì)數(shù)器只能顯示0~9十個(gè)數(shù),為了擴(kuò)大計(jì)數(shù)器范圍,常用多個(gè)十進(jìn)制
    發(fā)表于 11-22 12:53 ?4073次閱讀
    <b class='flag-5'>計(jì)數(shù)器</b>的級(jí)連使用

    環(huán)形計(jì)數(shù)器和扭環(huán)形計(jì)數(shù)器

    環(huán)形計(jì)數(shù)器和扭環(huán)形計(jì)數(shù)器 移位寄存也可以構(gòu)成計(jì)數(shù)器,稱(chēng)為移位型計(jì)數(shù)器。它有兩種結(jié)構(gòu):環(huán)形計(jì)數(shù)器
    發(fā)表于 01-12 14:07 ?9836次閱讀

    計(jì)數(shù)器,計(jì)數(shù)器的工作原理是什么?

    計(jì)數(shù)器,計(jì)數(shù)器的工作原理是什么? 在數(shù)字系統(tǒng)中使用最多的時(shí)序電路是計(jì)數(shù)器計(jì)數(shù)器不僅能用于對(duì)時(shí)鐘脈沖進(jìn)行計(jì)數(shù)還可以用于分頻、定時(shí),產(chǎn)生
    發(fā)表于 03-08 13:50 ?6.1w次閱讀

    個(gè)連環(huán)無(wú)敵面試題--計(jì)數(shù)器

    問(wèn)題1:如何用Verilog實(shí)現(xiàn)這個(gè)計(jì)數(shù)器?針對(duì)上述功能的計(jì)數(shù)器,應(yīng)該如何用Verilog實(shí)現(xiàn)?
    的頭像 發(fā)表于 05-16 15:16 ?6393次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>連環(huán)無(wú)敵面試題--<b class='flag-5'>計(jì)數(shù)器</b>

    如何構(gòu)建個(gè)使用IR光束的對(duì)象計(jì)數(shù)器

    個(gè)電路,計(jì)算有多少人走過(guò)扇門(mén)或個(gè)對(duì)象通過(guò)個(gè)點(diǎn)
    的頭像 發(fā)表于 07-30 11:15 ?2149次閱讀

    使用計(jì)數(shù)器作為原型構(gòu)建電路

    電子發(fā)燒友網(wǎng)站提供《使用計(jì)數(shù)器作為原型構(gòu)建電路.zip》資料免費(fèi)下載
    發(fā)表于 11-30 11:12 ?0次下載
    使用<b class='flag-5'>計(jì)數(shù)器</b>作為原型<b class='flag-5'>構(gòu)建</b>電路

    同步計(jì)數(shù)器和異步計(jì)數(shù)器是什么 同步計(jì)數(shù)器和異步計(jì)數(shù)器的主要區(qū)別?

    在數(shù)字電子產(chǎn)品中,計(jì)數(shù)器是由系列觸發(fā)組成的時(shí)序邏輯電路。顧名思義,計(jì)數(shù)器用于計(jì)算輸入在負(fù)或正邊沿轉(zhuǎn)換中出現(xiàn)的次數(shù)。根據(jù)觸發(fā)觸發(fā)的方式,
    的頭像 發(fā)表于 03-25 17:31 ?2.6w次閱讀
    同步<b class='flag-5'>計(jì)數(shù)器</b>和異步<b class='flag-5'>計(jì)數(shù)器</b>是什么 同步<b class='flag-5'>計(jì)數(shù)器</b>和異步<b class='flag-5'>計(jì)數(shù)器</b>的主要區(qū)別?

    構(gòu)建LED二進(jìn)制計(jì)數(shù)器

    電子發(fā)燒友網(wǎng)站提供《構(gòu)建LED二進(jìn)制計(jì)數(shù)器.zip》資料免費(fèi)下載
    發(fā)表于 06-12 09:54 ?3次下載
    <b class='flag-5'>構(gòu)建</b>LED二進(jìn)制<b class='flag-5'>計(jì)數(shù)器</b>

    使用IC555和IC4026構(gòu)建的人/物體計(jì)數(shù)器電路

    人/物體計(jì)數(shù)器電路在銀行,醫(yī)院,工廠等中具有廣泛的應(yīng)用。該項(xiàng)目的重點(diǎn)是使用IR作為傳感元件構(gòu)建個(gè)有效的計(jì)數(shù)器,并且能夠從0
    的頭像 發(fā)表于 07-02 11:33 ?1145次閱讀
    使用IC555和IC4026<b class='flag-5'>構(gòu)建</b>的人/物體<b class='flag-5'>計(jì)數(shù)器</b>電路

    計(jì)數(shù)器構(gòu)建

    電子發(fā)燒友網(wǎng)站提供《計(jì)數(shù)器構(gòu)建.zip》資料免費(fèi)下載
    發(fā)表于 07-05 09:11 ?0次下載
    <b class='flag-5'>計(jì)數(shù)器</b>的<b class='flag-5'>構(gòu)建</b>

    使用移位寄存構(gòu)建環(huán)形計(jì)數(shù)器電路

    移位寄存種重要的數(shù)字電路元件,可用于構(gòu)建各種電路,包括環(huán)形計(jì)數(shù)器。在這篇文章中,我們將介紹如何使用移位寄存來(lái)
    的頭像 發(fā)表于 07-09 11:42 ?4625次閱讀

    同步計(jì)數(shù)器和異步計(jì)數(shù)器各有什么特點(diǎn)

    : 同步計(jì)數(shù)器種同步機(jī)制,用于控制多個(gè)線程的順序執(zhí)行。它們使用共享的計(jì)數(shù)器,并在計(jì)數(shù)器達(dá)到特定值時(shí)觸發(fā)線程的執(zhí)行。下面是同步計(jì)數(shù)器的幾個(gè)
    的頭像 發(fā)表于 12-15 10:49 ?2084次閱讀

    計(jì)數(shù)器怎么用 計(jì)數(shù)器的作用有哪些

    計(jì)數(shù)器種被廣泛應(yīng)用于各個(gè)領(lǐng)域的實(shí)用工具,在我們的日常生活中隨處可見(jiàn)。無(wú)論是進(jìn)行時(shí)間統(tǒng)計(jì),協(xié)助工作任務(wù)的完成,還是用于科學(xué)研究和編程技術(shù),在各個(gè)領(lǐng)域都起到了重要的作用。本文將詳細(xì)介紹計(jì)數(shù)器
    的頭像 發(fā)表于 02-03 10:04 ?5542次閱讀