計算機視覺之手勢、面部、姿勢捕捉以Python Mediapipe為工具

計算機視覺之手勢、面部、姿勢捕捉以 Python Mediapipe為工具

文章目錄

  • 1.`Mediapipe`庫概述
  • 2.手勢捕捉(`hands`)
  • 3.面部捕捉(`face`)
  • 4.姿勢捕捉(`pose`)

1.Mediapipe庫概述

Mediapipe是一個開源且強大的Python庫,由Google開發和維護。它提供了豐富的工具和功能,用于處理實時多媒體數據。它可以幫助開發者快速構建各種視覺和音頻處理應用,并允許他們靈活地定制和擴展庫的功能。

Mediapipe庫的主要功能包括:

  1. 視覺處理:Mediapipe可以進行人臉檢測、姿勢估計、手部跟蹤等。它通過使用預訓練的模型和算法來分析圖像或視頻,并提供相應的結果。這使得開發者能夠輕松地實現各種視覺處理任務。
  2. 音頻處理:Mediapipe還可以進行音頻信號的處理,例如語音識別、音頻增強、語音轉換等。它提供了一些內置的音頻處理模塊,開發者可以使用這些模塊來快速構建自己的音頻處理流水線。
  3. 數據流處理:Mediapipe庫還提供了一套用于處理數據流的工具。開發者可以使用這些工具來構建復雜的數據處理流程,包括數據的輸入、輸出、轉換和合并等。這使得開發者能夠更方便地處理實時多媒體數據流。

本期博客,作者將分享使用Mediapipe庫實現手勢、面部、動作識別的方法。
????在這里插入圖片描述


2.手勢捕捉(hands)

該段代碼使用OpenCVMediaPipe庫來檢測攝像頭視頻中的手部,并在圖像上繪制關鍵點和連接線。

import cv2
import time
import mediapipe as mpcapture = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
pTime = 0
cTime = 0while (capture.isOpened()):retval, img = capture.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = hands.process(imgRGB)if results.multi_hand_landmarks:for handLms in results.multi_hand_landmarks:for id, lm in enumerate(handLms.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:"+str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 2,(0, 0, 255), 2)cv2.imshow("Video", img) key = cv2.waitKey(1)if key == 32:breakcapture.release()
cv2.destroyAllWindows()

效果展示:
??????在這里插入圖片描述


關于代碼,具體解釋如下:

  1. 導入所需的庫:

    • cv2:用于處理圖像和視頻的OpenCV庫。
    • time:用于計算幀率的Python標準庫。
    • mediapipe as mp:MediaPipe庫,用于手部檢測和姿態估計。
  2. 創建視頻捕獲對象:

    • 使用cv2.VideoCapture(0)創建一個視頻捕獲對象,參數0表示使用默認攝像頭。
  3. 初始化MediaPipe手部檢測器:

    • 使用mp.solutions.hands.Hands()創建一個手部檢測器對象。
    • hands.process(imgRGB)將每個視頻幀傳遞給檢測器進行處理,并返回檢測結果。
  4. 處理每個視頻幀:

    • 使用capture.read()讀取視頻幀,并將返回的結果存儲在retvalimg變量中。
    • 使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)將圖像從BGR格式轉換為RGB格式,以便與MediaPipe兼容。
    • 使用hands.process(imgRGB)對圖像進行手部檢測,返回結果保存在results變量中。
  5. 繪制檢測結果:

    • 使用results.multi_hand_landmarks判斷是否檢測到了手部。
    • 對于每個檢測到的手部,使用handLms.landmark遍歷所有關鍵點,并將其坐標從歸一化坐標轉換為圖像上的實際坐標。
    • 使用cv2.circle()在圖像中繪制關鍵點圓圈。
    • 使用mpDraw.draw_landmarks()在圖像中繪制手部關鍵點和連接線。
  6. 計算幀率:

    • 使用time.time()獲取當前時間戳,計算時間間隔以確定幀率。
    • 使用cv2.putText()在圖像上顯示幀率。
  7. 顯示圖像并等待按鍵:

    • 使用cv2.imshow()顯示處理后的圖像。
    • 使用cv2.waitKey(1)等待用戶按鍵,參數1表示等待1毫秒。
  8. 釋放資源:

    • 在循環結束后,使用capture.release()釋放視頻捕獲對象。
    • 使用cv2.destroyAllWindows()關閉所有窗口。
  9. 退出程序:

    • 按下空格鍵(32)可以退出程序。

3.面部捕捉(face)

該段代碼使用OpenCV和MediaPipe庫來檢測攝像頭視頻中的人臉,并在圖像上繪制人臉關鍵點和輪廓。

import cv2
import time
import mediapipe as mpcapture = cv2.VideoCapture(0)mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh()
mpDraw = mp.solutions.drawing_utilspTime = 0  # 上一幀的時間
cTime = 0  # 下一幀的時間while (capture.isOpened()):retval, img = capture.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = faceMesh.process(imgRGB)if results.multi_face_landmarks:for faceLms in results.multi_face_landmarks:for id, lm in enumerate(faceLms.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)# cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACEMESH_CONTOURS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:" + str(int(fps)), (10, 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)cv2.imshow("Video", img)key = cv2.waitKey(1)if key == 32:breakcapture.release()
cv2.destroyAllWindows()

以電影情節畫面替代攝像頭畫面,代碼效果展示如下:
在這里插入圖片描述


以下是代碼的解釋:

  1. 導入所需的庫:

    • cv2:用于處理圖像和視頻的OpenCV庫。
    • time:用于計算幀率的標準Python庫。
    • mediapipe as mp:MediaPipe庫,用于人臉檢測和特征點估計。
  2. 創建視頻捕獲對象:

    • 使用cv2.VideoCapture(0)創建一個視頻捕獲對象,參數0表示使用默認攝像頭。
  3. 初始化MediaPipe人臉檢測器:

    • 使用mp.solutions.face_mesh.FaceMesh()創建一個人臉檢測器對象。
    • faceMesh.process(imgRGB)將每個視頻幀傳遞給檢測器進行處理,并返回檢測結果。
  4. 處理每個視頻幀:

    • 使用capture.read()讀取視頻幀,并將返回的結果存儲在retvalimg變量中。
    • 使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)將圖像從BGR格式轉換為RGB格式,以便與MediaPipe兼容。
    • 使用faceMesh.process(imgRGB)對圖像進行人臉檢測,返回結果保存在results變量中。
  5. 繪制檢測結果:

    • 使用results.multi_face_landmarks判斷是否檢測到了人臉。
    • 對于每個檢測到的人臉,使用faceLms.landmark遍歷所有關鍵點,并將其坐標從歸一化坐標轉換為圖像上的實際坐標。
    • 使用mpDraw.draw_landmarks()在圖像中繪制人臉關鍵點和輪廓。
  6. 計算幀率:

    • 使用time.time()獲取當前時間戳,計算時間間隔以確定幀率。
    • 使用cv2.putText()在圖像上顯示幀率。
  7. 顯示圖像并等待按鍵:

    • 使用cv2.imshow()顯示處理后的圖像。
    • 使用cv2.waitKey(1)等待用戶按鍵,參數1表示等待1毫秒。
  8. 釋放資源:

    • 在循環結束后,使用capture.release()釋放視頻捕獲對象。
    • 使用cv2.destroyAllWindows()關閉所有窗口。
  9. 退出程序:

    • 按下空格鍵(32)可以退出程序。

4.姿勢捕捉(pose)

該段代碼使用OpenCV和MediaPipe庫來檢測攝像頭視頻中的人體姿勢,并在圖像上繪制關鍵點和連接線。

import cv2
import time
import mediapipe as mpvideo = cv2.VideoCapture(0)
mpPose = mp.solutions.pose
pose = mpPose.Pose()
mpDraw = mp.solutions.drawing_utilspTime = 0  # 上一幀的時間
cTime = 0  # 下一幀的時間while True:retval, img = video.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = pose.process(imgRGB)if results.pose_landmarks:for id, lm in enumerate(results.pose_landmarks.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)cv2.circle(img, (cx, cy), 15, (0, 255, 0), cv2.FILLED)mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, "fps:" + str(int(fps)), (10, 60), cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 255), 3)cv2.imshow("Video", img)key = cv2.waitKey(10)if key == 32:breakvideo.release()
cv2.destroyAllWindows()

效果展示:

????????在這里插入圖片描述


以下是代碼的解釋:

  1. 導入所需的庫:

    • cv2:用于處理圖像和視頻的OpenCV庫。
    • time:用于計算幀率的標準Python庫。
    • mediapipe as mp:MediaPipe庫,用于人體姿勢檢測。
  2. 創建視頻捕獲對象:

    • 使用cv2.VideoCapture(0)創建一個視頻捕獲對象,參數0表示使用默認攝像頭。
  3. 初始化MediaPipe人體姿勢檢測器:

    • 使用mp.solutions.pose.Pose()創建一個人體姿勢檢測器對象。
    • pose.process(imgRGB)將每個視頻幀傳遞給檢測器進行處理,并返回檢測結果。
  4. 處理每個視頻幀:

    • 使用video.read()讀取視頻幀,并將返回的結果存儲在retvalimg變量中。
    • 使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)將圖像從BGR格式轉換為RGB格式,以便與MediaPipe兼容。
    • 使用pose.process(imgRGB)對圖像進行人體姿勢檢測,返回結果保存在results變量中。
  5. 繪制檢測結果:

    • 使用results.pose_landmarks判斷是否檢測到了人體姿勢。
    • 對于每個檢測到的關鍵點,使用landmark遍歷所有關鍵點,并將其坐標從歸一化坐標轉換為圖像上的實際坐標。
    • 使用cv2.circle()在圖像中繪制關鍵點圓圈。
    • 使用mpDraw.draw_landmarks()在圖像中繪制人體姿勢關鍵點和連接線。
  6. 計算幀率:

    • 使用time.time()獲取當前時間戳,計算時間間隔以確定幀率。
    • 使用cv2.putText()在圖像上顯示幀率。
  7. 顯示圖像并等待按鍵:

    • 使用cv2.imshow()顯示處理后的圖像。
    • 使用cv2.waitKey(10)等待用戶按鍵,參數10表示等待10毫秒。
  8. 釋放資源:

    • 在循環結束后,使用video.release()釋放視頻捕獲對象。
    • 使用cv2.destroyAllWindows()關閉所有窗口。
  9. 退出程序:

    • 按下空格鍵(32)可以退出程序。

附:侯小啾Python基礎領航計劃專欄已上線,特價專欄只需9.9即可掃清入門路上一切障礙。
跟著小啾,入門無憂!無論是系統化學習,還是碎片化學習都是很好的選擇,點擊下方鏈接即可訂閱:
https://blog.csdn.net/weixin_48964486/category_12510091.html
更多精彩內容敬請期待,作者侯小啾持續為您推出!

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

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

相關文章

ExecuteScalar()方法

ExecuteScalar()方法 大家好,我是免費搭建查券返利機器人賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天,我們將深入探討數據庫編程中的一個關鍵主題——ExecuteScalar()方法&#xff…

stm32學習總結:3、Proteus8+STM32CubeMX+MDK很有搞頭

stm32學習總結:3、Proteus8STM32CubeMXMDK很有搞頭 文章目錄 stm32學習總結:3、Proteus8STM32CubeMXMDK很有搞頭一、前言二、資料收集三、實際案例-點燈1、Proteus8安裝2、Proteus創建stm32F013C6項目并添加外圍LED電路3、STM32CubeMX配置F103C6引腳生成…

12.10_黑馬數據結構與算法筆記Java

目錄 058 鏈表 e10 判環算法1 thinking:什么是空指針? 058 鏈表 e10 判環算法2 059 數組 e01 合并有序數組1 059 數組 e01 合并有序數組2 060 隊列 鏈表實現1 061 隊列 鏈表實現2 062 隊列 環形數組實現 方法1-1 063 隊列 環形數組實現 方法1-2…

帶有 RaspiCam 的 Raspberry Pi 監控和延時攝影攝像機

一、說明 一段時間以來,我一直想構建一個運動激活且具有延時功能的樹莓派相機,但從未真正找到我喜歡的案例。我在thingiverse上找到了這個適合樹莓派和相機的好案例。它是為特定的魚眼相機設計的,但從模型來看,我擁有的廉價中國魚…

【Vulnhub 靶場】【Hackable: III】【簡單 - 中等】【20210602】

1、環境介紹 靶場介紹:https://www.vulnhub.com/entry/hackable-iii,720/ 靶場下載:https://download.vulnhub.com/hackable/hackable3.ova 靶場難度:簡單 - 中等 發布日期:2021年06月02日 文件大小:1.6 GB 靶場作者&…

k8s常用操作命令

目標 了解 Kubernetes基礎命令。對已部署的應用故障排除。 基礎命令:create,delete,get,run,expose,set,explain,edit create 命令:根據文件或者輸入來創建資源 # 創建…

消融實驗:深度學習的關鍵分析工具

消融實驗:深度學習的關鍵分析工具 在深度學習和機器學習領域,消融實驗(Ablation Study)是一種重要的實驗方法,用于理解和評估模型的各個組成部分對其整體性能的貢獻。通過這種方法,研究人員可以更深入地了…

Docker | 自定義網絡

?作者簡介:大家好,我是Leo,熱愛Java后端開發者,一個想要與大家共同進步的男人???? ??個人主頁:Leo的博客 ??當前專欄:Docker系列 ?特色專欄: MySQL學習 ??本文內容: Docker | 自定義網絡 ??個人知識庫: 知識庫,歡迎大家訪問 1.前言 大家好,我是Leo哥…

當視覺遇到毫米波雷達:自動駕駛的三維目標感知基準

? 文章:Vision meets mmWave Radar: 3D Object Perception Benchmark for Autonomous Driving 作者: Yizhou Wang, Jen-Hao Cheng, Jui-Te Huang , Sheng-Yao Kuan , Qiqian Fu , Chiming Ni 編輯:點云PCL 歡迎各位加入知識星球,獲取PDF…

vector類

> 作者簡介:?舊言~,目前大二,現在學習Java,c,c,Python等 > 座右銘:松樹千年終是朽,槿花一日自為榮。 > 目標:熟悉vector庫 > 毒雞湯:從人生低谷…

UVM中的config_db機制傳遞interface

(1)定義interface interface my_if(input clk, input rst_n);logic [7:0] data;logic valid;endinterface (2)在tb中使用interface 定義了interface后,在top_tb中實例化DUT時,就可以直接使用。 先…

【面試總結】Java面試題目總結(一)

&#xff08;以下僅為個人見解&#xff0c;如果有誤&#xff0c;歡迎大家批評并指出錯誤&#xff0c;謝謝大家&#xff09; 1.項目中的驗證碼功能是如何實現的&#xff1f; 第一步&#xff1a;在項目的pom.xml文件中導入 EasyCaptcha 的依賴&#xff1b; <dependency>…

軟件崩潰時Visual Studio中看不到有效的調用堆棧,使用Windbg動態調試去分析定位

目錄 1、問題說明 2、使用Windbg查看崩潰時詳細的函數調用堆棧

SQL命令---修改字段名

介紹 使用sql語句修改字段名。 命令 alter table 表名 change 舊字段名 新字段名 新數據類型;例子 將a表id字段名改為id1 alter table a change id id1 int(12) NOT NULL;

20231207給NanoPC-T4(RK3399)開發板刷Android12的挖掘機方案的LOG

20231207給NanoPC-T4(RK3399)開發板刷Android12的挖掘機方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 參考資料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…

[python高級編程]:01-數據結構

此系列主要用于記錄Python學習過程中查閱的優秀文章&#xff0c;均為索引方式。其中內容只針對本作者一人&#xff0c;作者熟悉了解的內容不再重復記錄。 目錄 01-列表推導式 列表推導同filter和map的比較 02-元組 元組拆包 具名元組 01-列表推導式 列表推導同filter和map的比…

實現安裝“自由化”!在Windows 11中如何繞過“您嘗試安裝的應用程序未通過微軟驗證”

這篇文章描述了如果你不能安裝應用程序,而是當你在Windows 11中看到消息“您嘗試安裝的應用程序未通過微軟驗證”時該怎么辦。完成這些步驟將取消你安裝的應用程序必須經過Microsoft驗證的要求。 使用設置應用程序 “設置”應用程序提供了繞過此警告消息的最簡單方法,以便你…

Windows10下MySQL5.7.31解壓版安裝與卸載

一、安裝 1進入官網下載MySQL5.7.31解壓版&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) 2解壓文件 解壓目錄到D:\developer_tools\MySQL\mysql-5.7.31-winx64&#xff0c;在bin同級目錄下創建my.ini文件&#xff0c;寫入以下代碼&#xff1…

python簡易學生管理 + MySQL

數據庫表 Python代碼部分 import pymysqlclass StMgmt(object):def tips(self):"""提示用戶選擇的操作"""print("""學生管理系統 1.01.查看所有信息2.查看學生信息3.修改學生信息4.增加學生信息5.退出學生系統"""…

【網絡安全技術】傳輸層安全——SSL/TLS

一、TLS位置及架構 TLS建立在傳輸層TCP/UDP之上&#xff0c;應用層之下。 所以這可以解決一個問題&#xff0c;那就是為什么抓不到HTTP和SMTP包&#xff0c;因為這兩個在TLS之上&#xff0c;消息封上應用層的頭&#xff0c;下到TLS層&#xff0c;TLS層對上層消息整個做了加密&…