欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)戰(zhàn)之手勢(shì)識(shí)別控制電腦音量

 更新時(shí)間:2023年05月04日 16:06:50   作者:Python數(shù)據(jù)挖掘  
這篇文章主要為大家詳細(xì)介紹了一個(gè)Python OpenCV的實(shí)戰(zhàn)小項(xiàng)目——手勢(shì)識(shí)別控制電腦音量,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下

今天給大家?guī)?lái)一個(gè)OpenCV的實(shí)戰(zhàn)小項(xiàng)目——手勢(shì)識(shí)別控制電腦音量

先上個(gè)效果圖:

通過(guò)大拇指和食指間的開(kāi)合距離來(lái)調(diào)節(jié)電腦音量,即通過(guò)識(shí)別大拇指與食指這兩個(gè)關(guān)鍵點(diǎn)之間的距離來(lái)控制電腦音量大小

一、環(huán)境配置

這個(gè)項(xiàng)目需要的環(huán)境比較簡(jiǎn)單,主要就是opencv和mediapipe庫(kù)

import cv2
import mediapipe as mp
from ctypes import cast, POINTER
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
import pyautogui

缺庫(kù)的話直接:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  庫(kù)名稱

二、代碼介紹

1)初始化mediapipe庫(kù)

self.mp_drawing = mp.solutions.drawing_utils
self.mp_drawing_styles = mp.solutions.drawing_styles
self.mp_hands = mp.solutions.hands

2)獲取電腦音量范圍

devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
self.volume = cast(interface, POINTER(IAudioEndpointVolume))
self.volume.SetMute(0, None)
self.volume_range = self.volume.GetVolumeRange()

3)利用OpenCV讀取攝像頭視頻流進(jìn)行顯示

cap = cv2.VideoCapture(0)
resize_w = 640
resize_h = 480
while cap.isOpened():
    success, image = cap.read()
    image = cv2.resize(image, (resize_w, resize_h))

4)識(shí)別手掌,獲取手掌關(guān)鍵點(diǎn)坐標(biāo)

# 判斷是否有手掌
if results.multi_hand_landmarks:
    # 遍歷每個(gè)手掌
    for hand_landmarks in results.multi_hand_landmarks:
        # 在畫(huà)面標(biāo)注手指
        # 解析手指,存入各個(gè)手指坐標(biāo)
        landmark_list = []
        for landmark_id, finger_axis in enumerate(
                hand_landmarks.landmark):
            landmark_list.append([
                landmark_id, finger_axis.x, finger_axis.y,
                finger_axis.z
            ])
        if landmark_list:
            # 獲取大拇指指尖坐標(biāo)
            thumb_finger_tip = landmark_list[4]
            thumb_finger_tip_x = math.ceil(thumb_finger_tip[1] * resize_w)
            thumb_finger_tip_y = math.ceil(thumb_finger_tip[2] * resize_h)
            # 獲取食指指尖坐標(biāo)
            index_finger_tip = landmark_list[8]
            index_finger_tip_x = math.ceil(index_finger_tip[1] * resize_w)
            index_finger_tip_y = math.ceil(index_finger_tip[2] * resize_h)
            # 獲取中指尖坐標(biāo)
            middle_finger_tip = landmark_list[12]
            middle_finger_tip_x = math.ceil(middle_finger_tip[1] * resize_w)
            middle_finger_tip_y = math.ceil(middle_finger_tip[2] * resize_h)
            # 中指與食指中間點(diǎn)
            middle_index_finger_middle_point = (middle_finger_tip_x + index_finger_tip_x) // 2, (
                        middle_finger_tip_y + index_finger_tip_y) // 2
            # print(thumb_finger_tip_x)
            middle_finger_point = (middle_finger_tip_x, middle_finger_tip_y)
            index_finger_point = (index_finger_tip_x, index_finger_tip_y)
            # 畫(huà)指尖2點(diǎn)
            image = cv2.circle(image, middle_finger_point, 10, (255, 0, 255), -1)
            image = cv2.circle(image, index_finger_point, 10, (255, 0, 255), -1)
            image = cv2.circle(image,  middle_index_finger_middle_point, 10, (255, 0, 255), -1)
            # 畫(huà)2點(diǎn)連線
            image1 = cv2.line(image, middle_finger_point, index_finger_point, (255, 0, 255), 5)
            # 勾股定理計(jì)算長(zhǎng)度
            middle_index_line_len = math.hypot((middle_finger_tip_x - index_finger_tip_x),
                                      (middle_finger_tip_y - index_finger_tip_y))

5)將拇指與食指距離與電腦音量進(jìn)行關(guān)聯(lián)

# 當(dāng)食指中指距離大于65像素允許調(diào)音量
if middle_index_line_len < 65.0:
    # 拇指與食指中間點(diǎn)
    finger_middle_point = (thumb_finger_tip_x + index_finger_tip_x) // 2, (
                thumb_finger_tip_y + index_finger_tip_y) // 2
    # print(thumb_finger_tip_x)
    thumb_finger_point = (thumb_finger_tip_x, thumb_finger_tip_y)
    index_finger_point = (index_finger_tip_x, index_finger_tip_y)
    # 畫(huà)2點(diǎn)連線
    image = cv2.line(image, thumb_finger_point, index_finger_point, (255, 0, 255), 5)
    # 勾股定理計(jì)算長(zhǎng)度
    line_len = math.hypot((index_finger_tip_x - thumb_finger_tip_x),
                          (index_finger_tip_y - thumb_finger_tip_y))
    # 獲取電腦最大最小音量
    min_volume = self.volume_range[0]
    max_volume = self.volume_range[1]
    # 將指尖長(zhǎng)度映射到音量上
    vol = np.interp(line_len, [50, 300], [min_volume, max_volume])
    # 將指尖長(zhǎng)度映射到矩形顯示上
    rect_height = np.interp(line_len, [50, 300], [0, 200])
    rect_percent_text = np.interp(line_len, [50, 300], [0, 100])
    # 設(shè)置電腦音量
    self.volume.SetMasterVolumeLevel(vol, None)
#鎖定調(diào)音量,進(jìn)行鼠標(biāo)控制
else:                             
    for id, lm in enumerate(hand_landmarks.landmark):
        # print(id,lm)
        h, w, c = image.shape
        cx, cy = int(lm.x * w), int(lm.y * h)
        # id=手部關(guān)鍵點(diǎn)
        if id == 0:
            if cx > dot[0] and cx < dot[2] and cy > dot[1] and cy < dot[3]:
                x0 = ((cx-dot[0])/(dot[2]-dot[0]))*1920
                y0 = ((cy-dot[1])/(dot[3]-dot[1]))*1080
                pyautogui.moveTo(x0, y0, duration=0.02)
        # print(thumb_finger_tip_x)
        thumb_finger_point = (thumb_finger_tip_x, thumb_finger_tip_y)
        index_finger_point = (index_finger_tip_x, index_finger_tip_y)
        # 畫(huà)指尖2點(diǎn)
        image = cv2.circle(image, thumb_finger_point, 10, (255, 0, 255), -1)
        image = cv2.circle(image, index_finger_point, 10, (255, 0, 255), -1)
        image = cv2.circle(image, finger_middle_point, 10, (255, 0, 255), -1)
        # 畫(huà)2點(diǎn)連線
        image = cv2.line(image, thumb_finger_point, index_finger_point, (255, 0, 255), 5)
        # 勾股定理計(jì)算長(zhǎng)度
        line_len = math.hypot((index_finger_tip_x - thumb_finger_tip_x),
                              (index_finger_tip_y - thumb_finger_tip_y))
        # 操作
        # 左鍵雙擊   
        if line_len < 20:
            pyautogui.doubleClick()
            ms_d = 0

三、使用方式

1)直接運(yùn)行程序

2)把手掌靠近攝像頭,置于矩形框內(nèi)

3)通過(guò)拇指與食指的開(kāi)合即可調(diào)節(jié)音量

到此這篇關(guān)于Python實(shí)戰(zhàn)之手勢(shì)識(shí)別控制電腦音量的文章就介紹到這了,更多相關(guān)Python手勢(shì)識(shí)別控制電腦音量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Python數(shù)學(xué)建模之整數(shù)規(guī)劃

    淺談Python數(shù)學(xué)建模之整數(shù)規(guī)劃

    整數(shù)規(guī)劃并不一定是線性規(guī)劃問(wèn)題的變量取整限制,對(duì)于二次規(guī)劃、非線性規(guī)劃問(wèn)題也有變量取整限制而引出的整數(shù)規(guī)劃。但在數(shù)學(xué)建模問(wèn)題中所說(shuō)的整數(shù)規(guī)劃,通常是指整數(shù)線性規(guī)劃。整數(shù)規(guī)劃與線性規(guī)劃的差別只是變量的整數(shù)約束。選擇簡(jiǎn)單通用的編程方案,讓求解器去處理吧
    2021-06-06
  • Python常用標(biāo)準(zhǔn)庫(kù)詳解(pickle序列化和JSON序列化)

    Python常用標(biāo)準(zhǔn)庫(kù)詳解(pickle序列化和JSON序列化)

    這篇文章主要介紹了Python常用標(biāo)準(zhǔn)庫(kù),主要包括pickle序列化和JSON序列化模塊,通過(guò)使用場(chǎng)景分析給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • python運(yùn)行時(shí)間的幾種方法

    python運(yùn)行時(shí)間的幾種方法

    這篇文章主要為大家詳細(xì)介紹了python運(yùn)行時(shí)間的幾種方法,分析每一種運(yùn)行時(shí)間方法的利弊,感興趣的小伙伴們可以參考一下
    2016-06-06
  • python繪制箱型圖

    python繪制箱型圖

    這篇文章主要為大家詳細(xì)介紹了python繪制箱型圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • python工具之清理 Markdown 中沒(méi)有引用的圖片

    python工具之清理 Markdown 中沒(méi)有引用的圖片

    這篇文章主要介紹了python工具之清理 Markdown 中沒(méi)有引用的圖片,文章圍繞主題展開(kāi)詳細(xì)的的內(nèi)容介紹,需要的朋友可以參考一下
    2022-06-06
  • python數(shù)據(jù)處理之如何選取csv文件中某幾行的數(shù)據(jù)

    python數(shù)據(jù)處理之如何選取csv文件中某幾行的數(shù)據(jù)

    這篇文章主要給大家介紹了關(guān)于python數(shù)據(jù)處理之如何選取csv文件中某幾行的數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Python大數(shù)據(jù)量文本文件高效解析方案代碼實(shí)現(xiàn)全過(guò)程

    Python大數(shù)據(jù)量文本文件高效解析方案代碼實(shí)現(xiàn)全過(guò)程

    在數(shù)據(jù)分析中,有時(shí)數(shù)據(jù)源會(huì)是超大的文本文件(幾G,或在幾十G),需要從中提取需要的信息,下面這篇文章主要給大家介紹了關(guān)于Python大數(shù)據(jù)量文本文件高效解析方案代碼實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 思考分析Python運(yùn)算中?a+=b?和?a=a+b是否相等

    思考分析Python運(yùn)算中?a+=b?和?a=a+b是否相等

    這篇文章主要為大家介紹了Python運(yùn)算中a+=b和a=a+b是否相等及原理思考分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • OpenCV-Python圖像輪廓之輪廓特征詳解

    OpenCV-Python圖像輪廓之輪廓特征詳解

    圖像輪廓是指由位于邊緣、連續(xù)的、具有相同顏色和強(qiáng)度的點(diǎn)構(gòu)成的曲線,它可以用于形狀分析以及對(duì)象檢測(cè)和識(shí)別。本文將帶大家詳細(xì)了解一下圖像的輪廓特征,感興趣的可以學(xué)習(xí)一下
    2021-12-12
  • python實(shí)現(xiàn)矩陣的示例代碼

    python實(shí)現(xiàn)矩陣的示例代碼

    本文主要介紹了python實(shí)現(xiàn)矩陣的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論