一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

科技觀察員 ? 來源:circuitdigest ? 作者:Ashish Choudhary ? 2022-07-28 17:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

樹莓派 4

Pi 相機模塊

揚聲器

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

什么是媒體管道?

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

物體檢測

人臉檢測

手部追蹤

姿勢估計

多手追蹤

頭發(fā)分割

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

須藤 pip3 安裝 mediapipe-rpi4

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

須藤 pip3 安裝 mediapipe-rpi3

安裝 OpenCV

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

sudo apt-get 更新

然后使用以下命令安裝在 Raspberry Pi 上安裝 OpenCV 所需的依賴項。

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

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

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

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

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

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

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

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

def findPosition(圖像,繪制=真):
  lmList = []
  如果結(jié)果.pose_landmarks:
      mp_drawing.draw_landmarks(
         圖像,results.pose_landmarks,mp_pose.POSE_CONNECTIONS)
      對于 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 攝像頭開始視頻流。您甚至可以使用預(yù)先錄制的視頻,而不是使用實時流。為此,將“0”替換為視頻路徑。

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

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

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

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

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

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

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

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

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

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

之后,我們會將所有檢測的 id 和坐標存儲在一個名為 lmList 的變量中。

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

然后在接下來的幾行中,我們將首先獲取兩個肩膀的坐標,然后在上面畫圓。如下圖所示,左右肩的 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)我們找到肩膀的坐標時,我們將把這些坐標與兩個肘部的坐標進行比較。所以,如果肩膀與肘部在同一水平或在肘部以下,我們將階段設(shè)置為“向下”,當(dāng)肩膀在肘部以上時,階段將變?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":
        階段=“向上”
        計數(shù)器 += 1
        打?。ㄓ嫈?shù)器)

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

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

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

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

測試上推計數(shù)器腳本

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

poYBAGLiU3GAGyLjAAWQK_s986M552.png

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

pYYBAGLiU22AFxJFAAYLSWKkCgg804.png

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

pYYBAGLiU2aAVasbAAWRmbXSh-E573.png

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

代碼

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) 作為姿勢:

而 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)

# 為了提高性能,可選擇將圖像標記為不可寫入

# 通過引用傳遞。

results = pose.process(image)

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

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

    關(guān)注

    29

    文章

    1341

    瀏覽量

    64140
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2291

    瀏覽量

    96396
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    構(gòu)建4位二進制計數(shù)器

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

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

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

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

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

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

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

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

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

    連環(huán)無敵面試題--計數(shù)器

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

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

    電路,計算有多少人走過扇門或對象通過
    的頭像 發(fā)表于 07-30 11:15 ?2400次閱讀

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

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

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

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

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

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

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

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

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

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

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

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

    同步計數(shù)器和異步計數(shù)器各有什么特點

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

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

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