俯臥撐計數器(Python)

?

通過 MediaPipe 檢測人體姿態,計算俯臥撐角度和計數,并在圖像上進行可視化展示

需要有cv2庫和mediapipe庫

mediapipe庫:

MediaPipe是Google開源的機器學習框架,用于構建實時音頻、視頻和多媒體處理應用程序。它提供了一組預訓練的模型和工具,幫助開發人員快速構建和部署計算機視覺和音頻處理應用。MediaPipe庫的特點包括實時性能、多平臺兼容性、靈活性和易用性。

MediaPipe庫的主要功能包括:

1. 視頻和圖像處理:提供了各種預訓練的模型和工具,用于視頻流分析和處理,例如人臉檢測、姿態估計、手勢識別等。

2. 音頻處理:提供了模型和工具,用于音頻流的實時處理,例如語音識別、語音分割、聲音增強等。

3. 數據流圖:使用數據流圖構建和組合多個模塊,以實現復雜的音頻、視頻和多媒體處理應用程序。

4. 跨平臺支持:支持多種平臺,包括Android、iOS、Linux、Windows等。

5. 開發者工具:提供了一些工具,用于開發和調試MediaPipe應用程序,例如模型訓練和調優、性能分析等。

總之,MediaPipe庫是一個功能強大的機器學習框架,用于實時音頻、視頻和多媒體處理應用程序的開發和部署。它提供了豐富的預訓練模型和工具,使開發人員能夠快速搭建高性能的應用程序。

目錄

定義計算角度的函數:

初始化MediaPipe Pose實例:?

?打開視頻:

讀取視頻幀:

計算個數:

?繪制圖像:

完整代碼:?

定義計算角度的函數:

def calculate_angle(a, b, c):# 將輸入點轉換為numpy數組a = np.array(a)b = np.array(b)c = np.array(c)# 計算兩個向量的角度差(弧度)radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - np.arctan2(a[1] - b[1], a[0] - b[0])# 轉換為角度(度)angle = np.abs(radians * 180.0 / np.pi)# 確保角度在0到360度之間if angle > 180.0:angle = 360 - anglereturn angle

初始化MediaPipe Pose實例:?

# 初始化MediaPipe Pose實例
pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
'''
min_detection_confidence:表示檢測到人體姿態的最小置信度閾值。當檢測到的姿態置信度低于該閾值時,可能會被視為無效檢測。
min_tracking_confidence:表示跟蹤人體姿態的最小置信度閾值。在跟蹤過程中,如果姿態的置信度低于該閾值,可能會重新進行檢測。
'''

?打開視頻:

cap = cv2.VideoCapture("D:\\桌面\\1.mp4")

讀取視頻幀:

ret, frame = cap.read()

計算個數:

 # 嘗試獲取姿態關鍵點try:landmarks = results.pose_landmarks.landmark# 獲取左肩、左肘和左腕的坐標shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]elbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x, landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]wrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x, landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]# 計算并顯示肘部到肩部的角度angle = calculate_angle(shoulder, elbow, wrist)cv2.putText(image, str(angle),tuple(np.multiply(elbow, [640, 480]).astype(int)),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)print(angle)# 根據角度更新俯臥撐計數if angle > max_angle:stage = "down"if angle < min_angle and stage == 'down':stage = "up"counter += 1print(counter)except:pass

?

?繪制圖像:

 # 在圖像上繪制矩形框,用于顯示計數和階段cv2.rectangle(image, (0, 0), (225, 73), (245, 117, 16), -1)# 在矩形框內顯示計數和階段cv2.putText(image, 'COUNTER', (15, 22),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, str(counter),(35, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)cv2.putText(image, 'STAGE', (135, 22),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, stage,(130, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)# 在圖像上繪制關鍵點和連接線mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2),mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2))# 顯示處理后的圖像cv2.imshow('Mediapipe Feed', image)# 檢查是否按下'q'鍵退出if cv2.waitKey(10) & 0xFF == ord('q'):break

完整代碼:?

#coding:utf-8
# 導入必要的庫
import cv2
import mediapipe as mp  #通過 MediaPipe 檢測人體姿態,計算俯臥撐角度和計數,并在圖像上進行可視化展示
import numpy as np
import logging# 配置日志記錄
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 記錄日志信息
logging.info('這是一條信息日志')
logging.warning('這是一條警告日志')
logging.error('這是一條錯誤日志')# 定義計算角度的函數
"""計算三個點之間的角度參數:a (list):第一個點的坐標b (list):第二個點的坐標c (list):第三個點的坐標返回:float:三個點之間的角度(度)"""
def calculate_angle(a, b, c):# 將輸入點轉換為numpy數組a = np.array(a)b = np.array(b)c = np.array(c)# 計算兩個向量的角度差(弧度)radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - np.arctan2(a[1] - b[1], a[0] - b[0])# 轉換為角度(度)angle = np.abs(radians * 180.0 / np.pi)# 確保角度在0到360度之間if angle > 180.0:angle = 360 - anglereturn angle# 導入MediaPipe的繪圖工具和Pose解決方案
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose# 初始化MediaPipe Pose實例
pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
'''
min_detection_confidence:表示檢測到人體姿態的最小置信度閾值。當檢測到的姿態置信度低于該閾值時,可能會被視為無效檢測。
min_tracking_confidence:表示跟蹤人體姿態的最小置信度閾值。在跟蹤過程中,如果姿態的置信度低于該閾值,可能會重新進行檢測。
'''# 打開視頻
cap = cv2.VideoCapture("D:\\桌面\\1.mp4")# 計數器變量
counter = 0
# 當前動作階段
stage = None
# 完成俯臥撐的最大角度
max_angle = 160
# 準備開始俯臥撐的最小角度
min_angle = 60while cap.isOpened():# 讀取視頻幀ret, frame = cap.read()# BGR圖像轉為RGB,便于MediaPipe處理image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)image.flags.writeable = False# 使用MediaPipe進行姿態檢測results = pose.process(image)# 重新轉為BGRimage.flags.writeable = Trueimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)# 嘗試獲取姿態關鍵點try:landmarks = results.pose_landmarks.landmark# 獲取左肩、左肘和左腕的坐標shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]elbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x, landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]wrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x, landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]# 計算并顯示肘部到肩部的角度angle = calculate_angle(shoulder, elbow, wrist)cv2.putText(image, str(angle),tuple(np.multiply(elbow, [640, 480]).astype(int)),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)print(angle)# 根據角度更新俯臥撐計數if angle > max_angle:stage = "down"if angle < min_angle and stage == 'down':stage = "up"counter += 1print(counter)except:pass# 在圖像上繪制矩形框,用于顯示計數和階段cv2.rectangle(image, (0, 0), (225, 73), (245, 117, 16), -1)# 在矩形框內顯示計數和階段cv2.putText(image, 'COUNTER', (15, 22),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, str(counter),(35, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)cv2.putText(image, 'STAGE', (135, 22),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, stage,(130, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)# 在圖像上繪制關鍵點和連接線mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2),mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2))# 顯示處理后的圖像cv2.imshow('Mediapipe Feed', image)# 檢查是否按下'q'鍵退出if cv2.waitKey(10) & 0xFF == ord('q'):break# 釋放視頻資源,關閉所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42860.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42860.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42860.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

一文清晰了解HTML

有這樣一個txt記事本文件和一張圖片&#xff1a; txt文本內容是這樣的&#xff1a; <html><head><title>HTML學習</title></head><body><h1>hello HTML</h1><img src"高清修復.png"/></body> </html…

LabVIEW的JKI State Machine

JKI State Machine是一種廣泛使用的LabVIEW架構&#xff0c;由JKI公司開發。這種狀態機架構在LabVIEW中提供了靈活、可擴展和高效的編程模式&#xff0c;適用于各種復雜的應用場景。JKI State Machine通過狀態的定義和切換&#xff0c;實現了程序邏輯的清晰組織和管理&#xff…

VSCode工程中task.json的作用

在 Visual Studio Code&#xff08;VSCode&#xff09;中&#xff0c;tasks.json 文件是用來定義和配置任務&#xff08;Tasks&#xff09;的。任務指的是在開發過程中需要自動化執行的一系列操作&#xff0c;例如編譯代碼、運行測試、打包項目等。通過配置 tasks.json&#xf…

In Search of Lost Online Test-time Adaptation: A Survey--論文筆記

論文筆記 資料 1.代碼地址 https://github.com/jo-wang/otta_vit_survey 2.論文地址 https://arxiv.org/abs/2310.20199 3.數據集地址 1論文摘要的翻譯 本文介紹了在線測試時間適應(online test-time adaptation,OTTA)的全面調查&#xff0c;OTTA是一種專注于使機器學習…

【軟件分享】我們都需要會用的ArcGIS10.8和ArcGIS Pro

ArcGIS是地理人必備的地理制圖、空間分析常用的工具&#xff0c;讀地理&#xff0c;或多或少都會接觸到ArcGIS的使用&#xff0c;今天小編要帶來的就是ArcGIS10.8軟件資源和升級版ArcGIS Pro的軟件資源。 軟件安裝包獲取 公眾號回復關鍵詞&#xff1a;“ArcGIS"&#xff…

*算法訓練(leetcode)第二十五天 | 134. 加油站、135. 分發糖果、860. 檸檬水找零、406. 根據身高重建隊列

刷題記錄 134. 加油站135. 分發糖果860. 檸檬水找零406. 根據身高重建隊列 134. 加油站 leetcode題目地址 記錄全局剩余油量和當前剩余油量&#xff0c;當前剩余小于0時&#xff0c;其實位置是當前位置的后一個位置。若全局剩余油量為負&#xff0c;則說明整體油量不足以走完…

防爆手機終端安全管理平臺

防爆手機終端安全管理平臺能夠滿足國家能源、化工企業對安全生產信息化運行需求&#xff0c;能夠快速搭建起高效、快捷的移動終端管理平臺&#xff0c;提高企業安全生產管理水平&#xff0c;保證企業的安全運行和可持續發展。#防爆手機 #終端安全 #移動安全 能源、化工等生產單…

公有鏈、私有鏈與聯盟鏈:區塊鏈技術的多元化應用與比較

引言 區塊鏈技術自2008年比特幣白皮書發布以來&#xff0c;迅速發展成為一項具有顛覆性潛力的技術。區塊鏈通過去中心化、不可篡改和透明的方式&#xff0c;提供了一種全新的數據存儲和管理方式。起初&#xff0c;區塊鏈主要應用于加密貨幣&#xff0c;如比特幣和以太坊。然而&…

SQL Server 設置端口詳解

前言 在數據庫管理和開發過程中&#xff0c;SQL Server是一個廣泛使用的關系型數據庫管理系統。默認情況下&#xff0c;SQL Server使用1433端口進行通信。然而&#xff0c;出于安全性、端口沖突或網絡限制等原因&#xff0c;我們有時需要更改SQL Server的默認端口。本文將詳細…

VBA-計時器的數據進行整理

對計時器的數據進行整理 需求原始數據程序步驟VBA程序結果 需求 需要在txt文件中提取出分和秒分別在兩列 原始數據 數據結構 計次7 00:01.855 計次6 00:09.028 計次5 00:08.586 計次4 00:08.865 計次3 00:07.371 計次2 00:06.192 計次1 00:05.949 程序步驟 1、利用Trim()去…

易備數據備份軟件——低成本、高效能、全方位地守護您的數據安全

在數字化的時代&#xff0c;數據是企業和個人最寶貴的資產。然而&#xff0c;數據丟失、系統故障、惡意攻擊等威脅時刻存在。如何確保數據的安全與完整&#xff1f;易備數據備份軟件為您提供全方位無死角的解決方案&#xff0c;讓您高枕無憂&#xff01; 云備份&#xff1a;暢…

CV每日論文--2024.7.4

1、InternLM-XComposer-2.5: A Versatile Large Vision Language Model Supporting Long-Contextual Input and Output 中文標題&#xff1a;InternLM-XComposer-2.5&#xff1a;支持長上下文輸入和輸出的多功能大視覺語言模型 簡介&#xff1a;我們推出了InternLM-XComposer-…

079、類的繼承

繼承是對已有的類進行擴展創建出新的類&#xff0c;這個過程就叫做繼承。其中&#xff0c;提供繼承信息的類叫做父類&#xff08;超類、基類&#xff09;&#xff0c;得到繼承信息的類稱為子類&#xff08;派生類&#xff09;。 基本語法 繼承是通過在類定義語句中使用圓括號…

控制周期與控制頻率

控制周期是指控制系統中執行一次完整控制循環所需的時間間隔。它表示了控制系統對輸入信號進行處理、執行控制算法、生成輸出信號并更新系統狀態的頻率。在實時控制系統中&#xff0c;控制周期的選擇對系統的性能和穩定性具有重要影響。較短的控制周期可以提高系統的響應速度&a…

高級java每日一道面試題-2024年7月8日

文章目錄 面試官問: final 在java中有什么作用面試者回答:1. final修飾變量基本數據類型&#xff1a;示例&#xff1a; 對象引用&#xff1a;示例&#xff1a; 2. final修飾方法示例&#xff1a; 3. final修飾類示例&#xff1a; 4. final局部變量和參數示例&#xff1a; 總結 …

互聯網十萬個為什么之什么是CDN?

CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是一組分布在不同地理位置的服務器&#xff0c;其目的是更有效地向用戶分發互聯網內容。通過緩存內容&#xff08;如網頁、圖片、視頻和其他類型的網絡數據&#xff09;在多個服務器上&#xff0c…

學生護眼臺燈哪個牌子實用?值得入手的學生護眼臺燈十大排名分析

在這個數碼時代&#xff0c;人們對屏幕的依賴程度越來越高&#xff0c;尤其是孩子們。他們不僅在學校里需要長時間盯著教科書&#xff0c;還會在學習和娛樂中使用各種數碼設備。然而&#xff0c;這也使得眼睛健康問題逐漸凸顯&#xff0c;尤其是兒童近視的問題。為了保護視力&a…

Flink 提交作業的方式

參考&#xff1a; Flink運行方式及對比-騰訊云開發者社區-騰訊云

IP地址設置的全面指南-okeyproxy

IP地址是每個連接到互聯網的設備的唯一識別字&#xff0c;無論是家庭網路還是企業網路&#xff0c;正確設置IP地址是確保網路穩定和安全的關鍵。IP地址由一系列數字組成&#xff0c;通常分為IPv4和IPv6兩種格式。IPv4是最常見的形式&#xff0c;由四組0到255之間的數字組成&…

濟南網站建設費用為什么差距如此之大

濟南網站建設費用的差距之所以如此之大&#xff0c;主要是由于以下幾個因素的影響。 首先&#xff0c;不同的網站建設公司所提供的服務內容和質量不盡相同&#xff0c;這直接導致了費用的差距。一些知名的大型網絡公司會提供全方位的網站建設服務&#xff0c;包括網站設計、頁面…