圖像處理篇---opencv實現坐姿檢測


文章目錄

  • 前言
  • 一、方法概述
    • 使用OpenCV和MediaPipe
    • 關鍵點檢測
    • 角度計算
    • 姿態評估
  • 二、完整代碼實現
  • 三、代碼說明
    • PostureDetector類
      • find_pose()
      • get_landmarks()
      • cakculate_angle()
      • evaluate_posture()
  • 坐姿評估標準(可進行參數調整):
  • 可視化功能:
  • 如何使用
    • 安裝依賴庫:
    • 運行腳本:
  • 四、改進方向


前言

坐姿檢測是計算機視覺中的一個應用,可以通過分析人體姿態來判斷是否保持正確坐姿。下面我將介紹使用Python實現坐姿檢測的方法和完整代碼。


一、方法概述

使用OpenCV和MediaPipe

使用OpenCV和MediaPipe:MediaPipe提供了現成的人體姿態估計模型

關鍵點檢測

關鍵點檢測:檢測身體關鍵點(如肩膀、耳朵、臀部等)

角度計算

角度計算:計算關鍵點之間的角度來判斷坐姿

姿態評估

姿勢評估:根據角度閾值判斷坐姿是否正確

二、完整代碼實現

import cv2
import mediapipe as mp
import numpy as np
import timeclass PostureDetector:def __init__(self, mode=False, upBody=False, smooth=True, detectionCon=0.5, trackCon=0.5):"""初始化姿勢檢測器參數:mode: 是否靜態圖像模式 (False表示視頻流)upBody: 是否只檢測上半身smooth: 是否平滑處理detectionCon: 檢測置信度閾值trackCon: 跟蹤置信度閾值"""self.mode = modeself.upBody = upBodyself.smooth = smoothself.detectionCon = detectionConself.trackCon = trackConself.mpDraw = mp.solutions.drawing_utilsself.mpPose = mp.solutions.poseself.pose = self.mpPose.Pose(static_image_mode=self.mode,model_complexity=1,smooth_landmarks=self.smooth,enable_segmentation=False,smooth_segmentation=self.smooth,min_detection_confidence=self.detectionCon,min_tracking_confidence=self.trackCon)# 坐姿評估參數self.good_posture_time = 0self.bad_posture_time = 0self.posture_status = "Unknown"self.last_posture_change = time.time()def find_pose(self, img, draw=True):"""檢測圖像中的姿勢關鍵點參數:img: 輸入圖像 (BGR格式)draw: 是否繪制關鍵點和連接線返回:帶標注的圖像和姿勢關鍵點"""img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)self.results = self.pose.process(img_rgb)if self.results.pose_landmarks and draw:self.mpDraw.draw_landmarks(img, self.results.pose_landmarks, self.mpPose.POSE_CONNECTIONS)return imgdef get_landmarks(self, img):"""獲取所有姿勢關鍵點的坐標參數:img: 輸入圖像返回:關鍵點坐標列表 (x,y,z) 或 None"""self.landmarks = []if self.results.pose_landmarks:for id, lm in enumerate(self.results.pose_landmarks.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)self.landmarks.append([id, cx, cy, lm.z])return self.landmarksdef calculate_angle(self, a, b, c):"""計算三個點之間的角度參數:a, b, c: 三個點的坐標 (x,y)返回:角度 (degrees)"""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)if angle > 180.0:angle = 360 - anglereturn angledef evaluate_posture(self, img, draw=True):"""評估坐姿是否正確參數:img: 輸入圖像draw: 是否在圖像上繪制評估結果返回:圖像和坐姿評估結果"""current_time = time.time()posture_changed = Falseif not self.landmarks or len(self.landmarks) < 33:return img, "No person detected"# 獲取需要的關節點left_shoulder = self.landmarks[11][1:3]  # 11: 左肩right_shoulder = self.landmarks[12][1:3]  # 12: 右肩left_ear = self.landmarks[7][1:3]  # 7: 左耳right_ear = self.landmarks[8][1:3]  # 8: 右耳left_hip = self.landmarks[23][1:3]  # 23: 左髖right_hip = self.landmarks[24][1:3]  # 24: 右髖# 計算肩膀中點shoulder_mid = ((left_shoulder[0] + right_shoulder[0]) // 2,(left_shoulder[1] + right_shoulder[1]) // 2)# 計算耳朵中點ear_mid = ((left_ear[0] + right_ear[0]) // 2,(left_ear[1] + right_ear[1]) // 2)# 計算髖部中點hip_mid = ((left_hip[0] + right_hip[0]) // 2,(left_hip[1] + right_hip[1]) // 2)# 計算脊柱角度 (肩膀-髖部-垂直線)spine_angle = self.calculate_angle((shoulder_mid[0], shoulder_mid[1] - 100),  # 肩膀上方一點shoulder_mid,hip_mid)# 計算頸部角度 (耳朵-肩膀-水平線)neck_angle = self.calculate_angle((ear_mid[0] - 100, ear_mid[1]),ear_mid,shoulder_mid)# 坐姿評估標準good_spine = 160 < spine_angle < 200  # 脊柱應該接近垂直good_neck = 70 < neck_angle < 110  # 頸部應該接近垂直# 判斷坐姿new_status = "Good" if good_spine and good_neck else "Bad"# 更新姿勢狀態時間if new_status != self.posture_status:posture_changed = Trueself.last_posture_change = current_timeself.posture_status = new_statuselse:if new_status == "Good":self.good_posture_time += 1else:self.bad_posture_time += 1# 在圖像上繪制結果if draw:# 繪制關鍵點和連接線cv2.circle(img, ear_mid, 8, (255, 0, 0), cv2.FILLED)cv2.circle(img, shoulder_mid, 8, (255, 0, 0), cv2.FILLED)cv2.circle(img, hip_mid, 8, (255, 0, 0), cv2.FILLED)cv2.line(img, ear_mid, shoulder_mid, (255, 0, 0), 3)cv2.line(img, shoulder_mid, hip_mid, (255, 0, 0), 3)# 顯示角度信息cv2.putText(img, f"Spine Angle: {int(spine_angle)}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(img, f"Neck Angle: {int(neck_angle)}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)# 顯示坐姿狀態color = (0, 255, 0) if new_status == "Good" else (0, 0, 255)cv2.putText(img, f"Posture: {new_status}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)# 顯示時間統計cv2.putText(img, f"Good Time: {self.good_posture_time//10}s", (10, 120), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)cv2.putText(img, f"Bad Time: {self.bad_posture_time//10}s", (10, 140), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)# 如果姿勢不良,添加警告if new_status == "Bad":cv2.putText(img, "WARNING: Bad Posture!", (img.shape[1]//2 - 150, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)return img, new_statusdef main():cap = cv2.VideoCapture(0)  # 使用攝像頭detector = PostureDetector()while True:success, img = cap.read()if not success:breakimg = detector.find_pose(img)landmarks = detector.get_landmarks(img)if landmarks:img, posture = detector.evaluate_posture(img)cv2.imshow("Posture Detection", img)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":main()

三、代碼說明

PostureDetector類

PostureDetector類:核心坐姿檢測類

find_pose()

find_pose(): 檢測圖像中的人體姿勢

get_landmarks()

get_landmarks(): 獲取姿勢關鍵點坐標

cakculate_angle()

calculate_angle(): 計算三個關鍵點之間的角度

evaluate_posture()

evaluate_posture(): 評估坐姿是否正確

坐姿評估標準(可進行參數調整):

脊柱角度應在160-200度之間(接近垂直)
頸部角度應在70-110度之間(接近垂直)
滿足以上條件判斷為"Good"坐姿,否則為"Bad"

可視化功能:

  1. 繪制關鍵點和連接線
  2. 顯示角度數值
  3. 顯示坐姿狀態和時間統計
  4. 不良坐姿時顯示警告

如何使用

安裝依賴庫:

pip install opencv-python mediapipe numpy

運行腳本:

python posture_detection.py

調整攝像頭位置,確保能清晰看到上半身

四、改進方向

  1. 添加更多評估標準(如肩膀是否前傾)
  2. 實現坐姿歷史記錄和統計分析
  3. 添加聲音提醒功能
  4. 優化性能(如降低圖像分辨率)
  5. 添加校準功能,適應不同體型
    這個實現提供了基本的坐姿檢測功能,你可以根據需要進一步擴展完善

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

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

相關文章

.Net HttpClient 使用代理功能

HttpClient 使用代理功能 實際開發中&#xff0c;HttpClient 通過代理訪問目標服務器是常見的需求。 本文將全面介紹如何在 .NET 中配置 HttpClient 使用代理&#xff08;Proxy&#xff09;功能&#xff0c;包括基礎使用方式、代碼示例、以及與依賴注入結合的最佳實踐。 注意…

【學習路線】 游戲客戶端開發入門到進階

目錄 游戲客戶端開發入門到進階&#xff1a;系統學習路線與推薦書單一、學習總原則&#xff1a;從底層出發&#xff0c;項目驅動&#xff0c;持續迭代二、推薦學習路線圖&#xff08;初學者→進階&#xff09;第一階段&#xff1a;語言基礎與編程思維第二階段&#xff1a;游戲開…

精益數據分析(57/126):創業移情階段的核心要點與實踐方法

精益數據分析&#xff08;57/126&#xff09;&#xff1a;創業移情階段的核心要點與實踐方法 在創業的浩瀚征程中&#xff0c;每一個階段都承載著獨特的使命與挑戰。今天&#xff0c;我們繼續秉持共同進步的理念&#xff0c;深入研讀《精益數據分析》&#xff0c;聚焦創業的首…

015枚舉之滑動窗口——算法備賽

滑動窗口 最大子數組和 題目描述 給你一個整數數組 nums &#xff0c;請你找出一個具有最大和的連續子數組&#xff08;子數組最少包含一個元素&#xff09;&#xff0c;返回其最大和。 原題鏈接 思路分析 見代碼注解 代碼 int maxSubArray(vector<int>& num…

微軟系統 紅帽系統 網絡故障排查:ping、traceroute、netstat

在微軟&#xff08;Windows&#xff09;和紅帽&#xff08;Red Hat Enterprise Linux&#xff0c;RHEL&#xff09;等系統中&#xff0c;網絡故障排查是確保系統正常運行的重要環節。 ping、traceroute&#xff08;在Windows中為tracert&#xff09;和netstat是三個常用的網絡…

解構認知邊界:論萬能方法的本體論批判與方法論重構——基于跨學科視閾的哲學-科學辯證

一、哲學維度的本體論批判 &#xff08;1&#xff09;理性主義的坍縮&#xff1a;從笛卡爾幻想到哥德爾陷阱 笛卡爾在《方法論》中構建的理性主義范式&#xff0c;企圖通過"普遍懷疑-數學演繹"雙重機制確立絕對方法體系。然而哥德爾不完備定理&#xff08;Gdel, 19…

【網絡入侵檢測】基于源碼分析Suricata的IP分片重組

【作者主頁】只道當時是尋常 【專欄介紹】Suricata入侵檢測。專注網絡、主機安全&#xff0c;歡迎關注與評論。 目錄 目錄 1.概要 2. 配置信息 2.1 名詞介紹 2.2 defrag 配置 3. 代碼實現 3.1 配置解析 3.1.1 defrag配置 3.1.2 主機系統策略 3.2 分片重組模塊 3.2.1…

二分查找的邊界問題

前言 二分查找(Binary Search)是一種高效的查找算法&#xff0c;時間復雜度為O(log n)。它適用于已排序的數組或列表。本文將詳細介紹二分查找的兩種常見寫法&#xff1a;閉區間寫法和左閉右開區間寫法。 一、二分查找基本思想 二分查找的核心思想是"分而治之"&am…

重慶醫科大學附屬第二醫院外科樓外擋墻自動化監測

1.項目概述 重慶醫科大學附屬第二醫院&#xff0c;重醫附二院&#xff0c;是集醫療、教學、科研、預防保健為一體的國家三級甲等綜合醫院。前身為始建于1892年的“重慶寬仁醫院”。醫院現有開放床位 1380張&#xff0c;年門診量超過百萬人次&#xff0c;年收治住院病人4.5萬人…

【Redis實戰篇】秒殺優化

1. 秒殺優化-異步秒殺思路 我們來回顧一下下單流程 當用戶發起請求&#xff0c;此時會請求nginx&#xff0c;nginx會訪問到tomcat&#xff0c;而tomcat中的程序&#xff0c;會進行串行操作&#xff0c;分成如下幾個步驟 1、查詢優惠卷 2、判斷秒殺庫存是否足夠 3、查詢訂單…

【idea】調試篇 idea調試技巧合集

前言&#xff1a;之前博主寫過一篇idea技巧合集的文章&#xff0c;由于技巧過于多了&#xff0c;文章很龐大&#xff0c;所以特地將調試相關的技巧單獨成章, 調試和我們日常開發是息息相關的&#xff0c;用好調試可以事半功倍 文章目錄 1. idea調試異步線程2. idea調試stream流…

postman 用法 LTS

postman 用法 LTS File ---- View ---- Show Postman Console

MySQL 數據庫故障排查指南

MySQL 數據庫故障排查指南 本指南旨在幫助您識別和解決常見的 MySQL 數據庫故障。我們將從問題識別開始&#xff0c;逐步深入到具體的故障類型和排查步驟。 1. 問題識別與信息收集 在開始排查之前&#xff0c;首先需要清晰地了解問題的現象和范圍。 故障現象&#xff1a; 數…

用AI寫簡歷是否可行?

讓AI批量寫簡歷然后投簡歷是絕對不行的&#xff01;&#xff01;&#xff01; 為什么不行&#xff0c;按照 "招聘經理" 工作經歷舉例&#xff1a; ai提示詞&#xff1a;請幫我寫一份招聘經理的工作經歷內容&#xff1a; 招聘經理 | XXX科技有限公司 | 2020年…

【從零實現JsonRpc框架#1】Json庫介紹

1.JsonCpp第三方庫 JSONCPP 是一個開源的 C 庫&#xff0c;用于解析和生成 JSON&#xff08;JavaScript Object Notation&#xff09;數據。它提供了簡單易用的接口&#xff0c;支持 JSON 的序列化和反序列化操作&#xff0c;適用于處理配置文件、網絡通信數據等場景。 2.Jso…

Ubuntu——執行echo $USE什么都不顯示

問題&#xff1a;“執行 echo $USER 什么都不顯示”&#xff1f; 一、原因分析 環境變量 $USER 未正確設置 $USER 是系統自動定義的環境變量&#xff0c;通常用于表示當前登錄的用戶名。若該變量未設置或為空&#xff0c;執行 echo $USER 會無輸出。可能場景&#xff1a; 用戶通…

uni-app學習筆記五--vue3插值表達式的使用

vue3快速上手導航&#xff1a;簡介 | Vue.js 模板語法 插值表達式 最基本的數據綁定形式是文本插值&#xff0c;它使用的是“Mustache”語法 (即雙大括號)&#xff1a; <span>Message: {{ msg }}</span> 雙大括號標簽會被替換為相應組件實例中 msg 屬性的值。同…

【PSINS工具箱】基于工具箱的單獨GNSS導航、單獨INS導航、兩者結合組合導航,三種導航的對比程序。附完整的代碼

本文給出基于PSINS工具箱的單獨GNSS導航、單獨INS導航、兩者結合組合導航(153EKF)的程序。并提供三者的軌跡對比、誤差對比。 文章目錄 運行結果MATLAB代碼代碼的簡單介紹簡介2. 平均絕對誤差 (MAE)主要模塊運行結果 三軸軌跡圖: 各軸誤差曲線: 命令行窗口的結果輸出: …

C. scanf 函數基礎

scanf 函數 1. scanf 函數基礎1.1 函數原型與頭文件1.2 格式化輸入的基本概念2.1 常見格式說明符整數格式說明符浮點數格式說明符字符和字符串格式說明符其他格式說明符2.2 格式說明符的高級用法寬度修飾符精度修飾符跳過輸入字段寬度組合修飾符對齊修飾符實際應用示例3.2 精度…

spring cloud loadbalancer實現機房感知的負載均衡

1 概述 在同城多機房情景下&#xff0c;各個機房各自部署一套微服務集群&#xff0c;正常情況下微服務調用在本機房閉環。在如下某些災難情景&#xff0c;可以嘗試拉遠調用以最大程度維持業務連續性&#xff0c;這些情景例如&#xff1a; A機房多個服務器宕機。應用由于BUG發…