Внедрить ручную маркировку с помощью медиапайпа
Внедрить ручную маркировку с помощью медиапайпа

Используйте медиапайп для выполнения отметки руки。получатьотметка После рук мы можем выполнять некоторые приложения, такие как отображение, использование жестов для выполнения некоторых элементов управления и т. д. В этой статье описывается использование opencv и mediapipe для обнаружения и отображения рук в камере (или видео), а также их маркировки и последующего применения отметки. руки управляют компьютером.

среда&Введение

opencv-python:Визуальная тематика。Чтение, запись и обработка изображений ивидео。 mediapipe:MediapipeдаGoogleПлатформа обработки мультимедиа с открытым исходным кодом。В этой статье используется версия0.10.2。 Установите их с помощью pip: pip install opencv-python pip install mediapipe

Введение с официального сайта mediapipe: Локальное машинное обучение поддерживает распространенные визуальные задачи: обнаружение целей, классификация изображений, сегментация, отслеживание рук, распознавание жестов и т. д. Предоставляет интерфейсы Andorid, JS и Python. Официальный сайт: https://developers.google.com/mediapipe.

отметка руки

1. Используйте opencv, чтобы получить изображение

Используйте opencv для вызова камеры, чтения изображения и отображения его.

Язык кода:javascript
копировать
import cv2

cap = cv2.VideoCapture(0)  # Получите камеру, вместо этого вы также можете импортировать из видеофайла
while True:
    success, img = cap.read()  # Читать картинки из камеры
    # Обработать изображение ...
   
    cv2.imshow("image", img)
    cv2.waitKey(1)

Чтобы показать количество изображений, обрабатываемых в секунду (fps), вычислите интервал между двумя кадрами:

Язык кода:javascript
копировать
...
import time

previous_time = 0
current_time = 0
cap = cv2.VideoCapture(0)  # Получить камеру
while True:
    success, img = cap.read()  # Читать картинки из камеры
    # Обработать изображение ...

    current_time = time.time()
    fps = 1 / (current_time - previous_time) # Получить интервал между двумя дисплеями
    previous_time = current_time

    cv2.putText(img, str(round(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 2)
    cv2.imshow("image", img)
    cv2.waitKey(1)

2. Используйте медиапайп для идентификации/маркировки рук.

Использование медиапайпа относительно просто. Вам нужно всего лишь создать экземпляр соответствующего объекта и передать изображение для получения результата.

Язык кода:javascript
копировать
import time

import cv2
import mediapipe as mp

cap = cv2.VideoCapture(0)
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils  # для рисования

pTime = 0
cTime = 0

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # Формат opencv по умолчанию — BGR, который необходимо преобразовать в RGB. Mediapipe справится с этим.
    results = hands.process(imgRGB)  # Вызовите метод процесса, чтобы обработать изображение и обнаружить руку.
    if results.multi_hand_landmarks:
        # results.multi_hand_landmarks — это список, каждый элемент которого представляет руку. Каждая рука имеет 20 маркеров положения.
        for hand_landmark in results.multi_hand_landmarks:
            mp_draw.draw_landmarks(img, hand_landmark, mp_hands.HAND_CONNECTIONS)

    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime

    cv2.putText(img, str(round(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 2)
    cv2.imshow("image", img)
    cv2.waitKey(1)

Каждая рука имеет 20 координат, обозначающих различные части руки (например, пальцы, пятку ладони...).

Модульный

Чтобы облегчить повторное использование, мы записали часть обнаружения рук в класс:

Язык кода:javascript
копировать
import time

import cv2
import mediapipe as mp


class HandDetector():
    def __init__(self, mode=False, max_hands=2, detection_conf=0.5, track_conf=0.5):
        self.mode = mode
        self.maxHands = max_hands
        self.detection_conf = detection_conf
        self.track_conf = track_conf
        self.mp_hands = mp.solutions.hands
        self.hands = self.mp_hands.Hands(self.mode, self.maxHands, 1, self.detection_conf, self.track_conf)
        self.mp_draw = mp.solutions.drawing_utils

    def find_hands(self, img, draw=True):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        self.results = self.hands.process(imgRGB)
        if self.results.multi_hand_landmarks:
            for handLms in self.results.multi_hand_landmarks:
                if draw:
                    self.mp_draw.draw_landmarks(img, handLms, self.mp_hands.HAND_CONNECTIONS)
        return img

    def find_position(self, img, hand_number=0, draw=True):
        lm_list = []
        if self.results.multi_hand_landmarks:
            hand_landmarks = self.results.multi_hand_landmarks[hand_number]
            for id, lm in enumerate(hand_landmarks.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                lm_list.append([id, cx, cy])
                if draw:
                    cv2.circle(img, (cx, cy), 7, (255, 0, 255), cv2.FILLED)
        return lm_list


def main():
    pTime = 0
    cTime = 0
    cap = cv2.VideoCapture(0)
    detector = HandDetector()

    while True:
        success, img = cap.read()
        img = detector.find_hands(img)
        lmList = detector.find_position(img)
        if len(lmList) != 0:
            print(lmList[0]) 
        cTime = time.time()
        fps = 1 / (cTime - pTime)
        pTime = cTime

        cv2.putText(img, str(round(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 2)
        cv2.imshow("image", img)
        cv2.waitKey(1)


if __name__ == '__main__':
    main()

Регулятор громкости

Используйте отметка, реализованную выше. рукии система, которая может изменитьсяобъембиблиотека(pycaw),Можно управлять жестамиобъем:Посчитайте кончики двух больших и указательных пальцев.расстояние,и поставьрасстояниепреобразован вобъем。также,Opencv также используется для отображения информации об объеме изображения.

Язык кода:javascript
копировать
# proj 1 volume hand control
import math
import time

import cv2
import numpy as np
# pycaw Для контроля объема
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume

from HnadTrackingModule import HandDetector


def main():
    devices = AudioUtilities.GetSpeakers()
    interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
    volume = interface.QueryInterface(IAudioEndpointVolume)
    vol_now = volume.GetMasterVolumeLevel()
    print("vol_now=",vol_now)
    vol_range = volume.GetVolumeRange()
    print("vol_range=", vol_range)  # vol= (-63.5, 0.0, 0.5)

    vol = 0
    vol_bar = 400
    vol_per = 0
    min_vol, max_vol = vol_range[0], vol_range[1]

    w_cam, h_cam = 640, 480

    p_time = 0
    c_time = 0
    cap = cv2.VideoCapture(0)
    cap.set(3, w_cam)
    cap.set(4, h_cam)
    detector = HandDetector(detection_conf=0.7)

    while True:
        success, img = cap.read()
        img = detector.find_hands(img)
        lm_list = detector.find_position(img, draw=False)
        if len(lm_list) != 0:
            print(lm_list[4], lm_list[8]) # Кончик большого и указательного пальца
            x1, y1 = lm_list[4][1], lm_list[4][2]
            x2, y2 = lm_list[8][1], lm_list[8][2]
            cx, cy = (x1 + x2) // 2, (y1 + y2) // 2  # середина
            cv2.circle(img, (x1, y1), 15, (255, 0, 255), cv2.FILLED)
            cv2.circle(img, (x2, y2), 15, (255, 0, 255), cv2.FILLED)
            cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)
            cv2.line(img, (x1, y1), (x2, y2), (255, 0, 255),3)
            # 计算расстояние            length = math.hypot(x2 - x1,y2 - y1)
            # расстояниеиобъемпреобразование            vol = np.interp(length, [10, 150], [min_vol, max_vol])

            # объем Процентная сумма VolumeLevel не является линейной зависимостью.
            level_percent = {-63.5: 0, -33.03: 10, -23.55: 20, -17.76: 30, -13.58: 40, -10.30: 50,
                             -7.61: 60, -5.32: 70, -3.33: 80, -1.57: 90, 0: 100}
            xp = list(level_percent.keys())
            fp = list(level_percent.values())
            vol_per = np.interp(vol, xp, fp)
            vol_bar = np.interp(vol_per, [0, 100], [400, 150])

            print("length=", length)  # 10 ~100
            print("vol=", vol)
            volume.SetMasterVolumeLevel(vol, None)

        cv2.rectangle(img, (50, 150), (85, 400), (0, 255, 0), 3)
        cv2.rectangle(img, (50, int(vol_bar)), (85, 400), (0, 255, 0), cv2.FILLED)

        cv2.putText(img, f"{int(vol_per)} %", (40, 450), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 2)

        c_time = time.time()
        fps = 1 / (c_time - p_time)
        p_time = c_time

        cv2.putText(img, str(round(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 2)
        cv2.imshow("image", img)
        cv2.waitKey(1)


if __name__ == '__main__':
    main()

ссылка:

  1. 1. Advanced Computer Vision with Python - Full Course: https://www.youtube.com/watch?v=01sAkU_NvOY
  2. 2. документация по медиапайпу: https://developers.google.com/mediapipe/solutions/vision/hand_landmarker/python.
  3. 3. pycaw(Регулятор громкости): https://github.com/AndreMiras/pycaw
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose