opencv實戰項目 手勢識別-手勢音量控制(opencv)

?本項目是使用了谷歌開源的框架mediapipe,里面有非常多的模型提供給我們使用,例如面部檢測,身體檢測,手部檢測等。

手勢識別系列文章

1.opencv實現手部追蹤(定位手部關鍵點)

2.opencv實戰項目 實現手勢跟蹤并返回位置信息(封裝調用)

3.手勢識別-手勢音量控制(opencv)

4.opencv實戰項目 手勢識別-手勢控制鼠標

未完待續...

在這里插入圖片描述

?代碼需要用到opencv? ?HandTraqckModule模塊? ?mediapipe模塊和一個音量控制模塊

AndreMiras/pycaw: Python Core Audio Windows Library (github.com)?音量控制模塊的作者,有興趣可以了解

手部追蹤模塊來自前期的我們實戰內容opencv 實現手勢跟蹤并返回位置信息(封裝調用)_陳子邇的博客-CSDN博客

下面給大家詳細說一下代碼

import cv2
import time
import numpy as np
from HandTraqckModule import *
import math
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume

這些行導入了所需的庫和模塊:

  • cv2: OpenCV 庫,用于圖像處理和顯示。
  • time: Python 標準庫,用于處理時間操作。
  • numpy: 數值計算庫,用于插值計算。
  • HandTraqckModule: 自定義的手部追蹤模塊(你的代碼中似乎有個拼寫錯誤,正確的應該是 HandTrackModule)。
  • math: Python 標準庫,用于數學計算。
  • comtypes: 用于處理 COM 接口的庫。
  • pycaw: 用于訪問 Windows 音頻控制接口的庫。
  • devices = AudioUtilities.GetSpeakers()
    interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
    volume = interface.QueryInterface(IAudioEndpointVolume)
    volRange = volume.GetVolumeRange()
    minVol = volRange[0]
    maxVol = volRange[1]
    

  • 這部分代碼獲取了默認音頻輸出設備的信息,并通過 pycaw 庫設置了音量范圍、最小音量和最大音量。

  • wCam, hCam = 1280, 720
    cap = cv2.VideoCapture(0)
    cap.set(3, wCam)
    cap.set(4, hCam)
    

    這里設置了攝像頭的分辨率,并通過 OpenCV 打開攝像頭。

pTime = 0
detector = handDetector(detectionCon=0.7)

初始化了上一幀的時間 pTime,并創建了 handDetector 類的實例 detector,設置了手勢檢測的置信度閾值為 0.7。

while True:success, img = cap.read()img = detector.findHands(img)lmList = detector.findPosition(img, draw=False)if len(lmList) != 0:# 從手部標記點列表中獲取兩個指尖的坐標x1, y1 = lmList[4][1], lmList[4][2]x2, y2 = lmList[8][1], lmList[8][2]cx, cy = (x1 + x2) // 2, (y1 + y2) // 2# 繪制手勢標記和連接線cv2.circle(img, (x1, y1), 15, (255, 255, 0), cv2.FILLED)cv2.circle(img, (x2, y2), 15, (255, 0, 0), cv2.FILLED)cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 3)cv2.circle(img, (cx, cy), 10, (255, 255, 0), cv2.FILLED)# 計算手勢長度length = math.hypot(x2 - x1, y2 - y1)# 映射手勢長度到音量范圍vol = np.interp(length, [10, 230], [minVol, maxVol])print(int(length), int(vol))# 設置系統音量volume.SetMasterVolumeLevel(vol, None)# 如果手勢長度小于一定閾值,繪制一個圓圈表示手勢過小if length < 50:cv2.circle(img, (cx, cy), 15, (255, 100, 100), cv2.FILLED)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTime# 繪制幀率信息cv2.putText(img, f'FPS:{int(fps)}', (40, 40), cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 0), 3)# 顯示圖像cv2.imshow('img', img)cv2.waitKey(1)

這部分代碼是主要的處理循環,它會不斷地從攝像頭捕獲圖像,然后使用 detector 對象進行手部檢測和標記繪制。隨后,通過手指標記點的坐標計算手勢的長度,并將這個長度映射到音量范圍,然后設置系統音量。如果手勢長度小于閾值,會在圖像上繪制一個圓圈來表示手勢過小。最后,還會繪制幀率信息并顯示圖像。

下面附上全部代碼

總體代碼

import cv2
import time
import numpy as np
from HandTraqckModule import *
import math
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume# 獲取默認音頻輸出設備
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = interface.QueryInterface(IAudioEndpointVolume)
# 獲取音量范圍
volRange = volume.GetVolumeRange()
minVol = volRange[0]
maxVol = volRange[1]# 設置攝像頭分辨率
wCam, hCam = 1280, 720# 打開攝像頭
cap = cv2.VideoCapture(0)
cap.set(3, wCam)
cap.set(4, hCam)pTime = 0
detector = handDetector(detectionCon=0.7)while True:success, img = cap.read()img = detector.findHands(img)lmList = detector.findPosition(img, draw=False)if len(lmList) != 0:x1, y1 = lmList[4][1], lmList[4][2]x2, y2 = lmList[8][1], lmList[8][2]cx, cy = (x1 + x2) // 2, (y1 + y2) // 2# 繪制手勢標記和連接線cv2.circle(img, (x1, y1), 15, (255, 255, 0), cv2.FILLED)cv2.circle(img, (x2, y2), 15, (255, 0, 0), cv2.FILLED)cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 3)cv2.circle(img, (cx, cy), 10, (255, 255, 0), cv2.FILLED)# 計算手勢長度length = math.hypot(x2 - x1, y2 - y1)# 映射手勢長度到音量范圍vol = np.interp(length, [10, 230], [minVol, maxVol])print(int(length), int(vol))# 設置系統音量volume.SetMasterVolumeLevel(vol, None)# 如果手勢長度小于一定閾值,繪制一個圓圈表示手勢過小if length < 50:cv2.circle(img, (cx, cy), 15, (255, 100, 100), cv2.FILLED)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTime# 繪制幀率信息cv2.putText(img, f'FPS:{int(fps)}', (40, 40), cv2.FONT_HERSHEY_PLAIN, 3, (255, 255, 0), 3)# 顯示圖像cv2.imshow('img', img)cv2.waitKey(1)

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

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

相關文章

8月14日,每日信息差

1、FF正式交付首輛FF 91 2.0 Futurist Alliance給塔尖用戶 2、消息稱iPhone SE 4設計基于iPhone 14&#xff0c;但仍是后置單攝像頭 3、阿聯酋力推電動汽車發展。該政策將作為一個監管框架&#xff0c;明確電動汽車充電站等基礎設施建設的標準&#xff0c;并推動全國標準統一…

Jay17 2023.8.12日報

8.12 今天做了2題&#xff0c;CTFshow 紅包挑戰8&#xff08;PHP create_function()&#xff09;和BUU [RoarCTF 2019]Easy Java&#xff08;web.xml泄露&#xff09;。 此外一直在打NepCTF&#xff0c;出了一題&#xff08;ez_java_checkin&#xff09;簡單了解了java中shri…

Kafka消息隊列學習(一)

文章目錄 概述核心概念生產者示例同步 / 異步發送消息生產者參數配置ack-確認機制retries - 重試次數compression_type - 消息壓縮類型 分區機制分區策略 消費者消息有序性提交和偏移量偏移量提交方式手動提交 高可用設計 SpringBoot集成Kafka基本使用傳遞對象消息 概述 核心概…

HTTP之cookie基礎學習

目錄 Cookie 什么是Cookie Cookie分類 Cookie版本 Cookie工作原理 Cookie詳解 創建cookie cookie編碼 cookie過期時間選項 Cookie流程 Cookie使用 會話管理 個性化信息 記錄用戶的行為 Cookie屬性 domain選項 path選項 secure選項 cookie…

帶著問題學習分布式系統

寫在前面 聽過很多道理&#xff0c;卻依然過不好這一生。 看過很多關于學習的技巧、方法&#xff0c;卻沒應用到自己的學習中。 隨著年紀變大&#xff0c;記憶力越來越差&#xff0c;整塊的時間也越來越少&#xff0c;于是&#xff0c;越來越希望能夠更高效的學習。學習是一種習…

香港大學余濤組推出開源XLANG Agent!支持三種Agent模式

作者 |小戲、ZenMoore 一個新的未來又逐漸開始從理論走向現實走到我們身邊了。 語言的意義在于使用&#xff0c;而從 ChatGPT 以來這些大規模語言模型的意義&#xff0c;也必然絕不止于 Chat&#xff0c;在四個月前&#xff0c;我們介紹了清華大學關于工具學習的綜述《清華發布…

Python-OpenCV中的圖像處理-圖像特征

Python-OpenCV中的圖像處理-圖像特征 圖像特征Harris角點檢測亞像素級精度的角點檢測Shi-Tomasi角點檢測SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features) 圖像特征 特征理解特征檢測特征描述 Harris角點檢測 cv2.cornerHarris(img, blockSize, ks…

海格里斯HEGERLS四向穿梭車倉儲解決方案在電子商務行業中的應用

隨著現代物流&#xff0c;尤其是智能化物流的飛速發展&#xff0c;河北沃克金屬制品有限公司看到了智能物流領域背后的巨大價值和市場空間&#xff0c;深知物流與供應鏈對企業發展的重要性。于是&#xff0c;引進了先進的高科技智能技術—HEGERLS四向穿梭車技術&#xff0c;并迅…

【日常積累】Linux下文件亂碼解決

linux下刪除亂碼文件、目錄 由于編碼原因&#xff0c;在linux服務器上上傳、創建中文文件或目錄時&#xff0c;會產生亂碼&#xff0c;如果想刪除它&#xff0c;有時候發現用rm命令是刪除不了的 這種情況下&#xff0c;用find命令可以刪除亂碼的文件或目錄。 首先進入亂碼文件…

docker 網絡訪問診斷

本地docker開啟nginx服務等&#xff0c; 發現linux系統重啟之后&#xff0c;無法訪問&#xff0c; 進入容器內部&#xff0c;發現可以訪問 但是容器外部&#xff0c;映射端口無法訪問&#xff1b; 診斷之前&#xff0c;發現docker0沒有IP綁定 rootbook:/etc/docker# ip addr …

自制手寫機器人

寫字機器人模擬在畫圖板上寫字效果 寫了一套寫字機器人代碼&#xff0c;有多種字體可供選擇&#xff0c;需要的朋友私信獲取代碼和軟件

Spring5學習筆記— 工廠高級特性

?作者簡介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;熱愛Java后端開發者&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;Leo的博客 &#x1f49e;當前專欄&#xff1a; Spring專欄 ?特色專欄&#xff1a; M…

創建型模式-原型模式

文章目錄 一、原型模式1. 概述2. 結構3. 實現4. 案例1.5 使用場景1.6 擴展&#xff08;深克隆&#xff09; 一、原型模式 1. 概述 用一個已經創建的實例作為原型&#xff0c;通過復制該原型對象來創建一個和原型對象相同的新對象。 2. 結構 原型模式包含如下角色&#xff1a; …

微服務架構和分布式架構的區別

微服務架構和分布式架構的區別 有&#xff1a;1、含義不同&#xff1b;2、概念層面不同&#xff1b;3、解決問題不同&#xff1b;4、部署方式不同&#xff1b;5、耦合度不同。其中&#xff0c;含義不同指微服務架構是一種將一個單一應用程序開發為一組小型服務的方法&#xff…

使用windows搭建WebDAV服務,并內網穿透公網訪問【無公網IP】

文章目錄 1. 安裝IIS必要WebDav組件2. 客戶端測試3. 使用cpolar內網穿透&#xff0c;將WebDav服務暴露在公網3.1 打開Web-UI管理界面3.2 創建隧道3.3 查看在線隧道列表3.4 瀏覽器訪問測試 4. 安裝Raidrive客戶端4.1 連接WebDav服務器4.2 連接成功4.2 連接成功 1. Linux(centos8…

【Vue-Router】路由入門

路由&#xff08;Routing&#xff09;是指確定網站或應用程序中特定頁面的方式。在Web開發中&#xff0c;路由用于根據URL的不同部分來確定應用程序中應該顯示哪個內容。 構建前端項目 npm init vuelatest //或者 npm init vitelatest安裝依賴和路由 npm install npm instal…

TCP重連 - 筆記

1 C++ TCP/IP 關于tcp斷線重連的問題 C++ TCP/IP 關于tcp斷線重連的問題_c++ 斷線重連_Bug&猿柒。的博客-CSDN博客 2 C++基礎--完善Socket C/S ,實現客戶端,服務器端斷開重連 https://www.cnblogs.com/kingdom_0/articles/2571727.html 3 C++實現Tcp通信(考慮客戶…

ATF BL1 UFS初始化簡單分析

ATF BL1 UFS初始化分析 1 ATF的下載鏈接2 ATF BL1 UFS 初始化簡易流程圖3 ATF BL1 ufs初始化簡單過程分析3.1 調用過程3.2 hikey960_ufs_init3.3 dw_ufs_init3.3 ufs_init 以海思hikey960為例來介紹&#xff0c;簡單介紹在ATF BL1階段的初始化處理。 1 ATF的下載鏈接 https:/…

藍帽杯 取證2022

網站取證 網站取證_1 下載附件 并解壓 得到了一個文件以及一個壓縮包 解壓壓縮包 用火絨查病毒 發現后門 打開文件路徑之后 發現了一句話木馬 解出flag 網站取證_2 讓找數據庫鏈接的明文密碼 打開www文件找找 查看數據庫配置文件/application/database.php&#xff08;CodeI…

Vue3.2+TS的父傳子,子傳父

這是父組件 <template><div><!-- 這個fn是子組件emit觸發名&#xff0c;兩邊保持一致 --><Child :num"num" fn"numUp"></Child></div> </template><script setup lang"ts"> import { ref } fr…