Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan Python+OpenCV untuk mencapai kesan menyeret petak maya

Cara menggunakan Python+OpenCV untuk mencapai kesan menyeret petak maya

WBOY
WBOYke hadapan
2023-05-15 19:22:12963semak imbas

1. Kesan projek

2 Proses teras

1. OpenCV membaca strim video dan melukis segi empat tepat pada setiap bingkai gambar.

2. Gunakan paip media untuk mendapatkan koordinat titik kekunci jari.

3. Berdasarkan kedudukan koordinat jari dan kedudukan koordinat segi empat tepat, tentukan sama ada titik jari berada pada segi empat tepat, segi empat tepat akan mengikut pergerakan jari.

3. Proses kod

Penyediaan persekitaran:

python: 3.8.8

opencv: 4.2.0.32

paip media: 0.8.8 .10.1

Nota:

1 Jika versi opencv terlalu tinggi atau terlalu rendah, beberapa masalah mungkin berlaku, seperti kamera tidak boleh dibuka, ranap, dll. Versi python mempengaruhi. versi pilihan opencv.

2. OpenCV mungkin tidak boleh digunakan seperti biasa selepas pip memasang mediapipe dan muat turun semula.

1. Baca video kamera dan lukis segi empat tepat

import cv2
import time
import numpy as np
 
 
# 调用摄像头 0 默认摄像头 
cap = cv2.VideoCapture(0)
 
# 初始方块数据
x = 100
y = 100
w = 100
h = 100
 
# 读取一帧帧照片
while True:
    # 返回frame图片
    rec,frame = cap.read()
    
    # 镜像
    frame = cv2.flip(frame,1)
    
    # 画矩形 
    cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 255), -1)
 
    # 显示画面
    cv2.imshow('frame',frame)
    
    # 退出条件
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    
cap.release()
cv2.destroyAllWindows()

Ini adalah langkah yang sangat asas, apabila kita menjalankan kod ini dan kamera dihidupkan, kita akan terkejut untuk melihat wajah kacak kami, dan terdapat segi empat tepat ungu 100*100 di sudut kiri atas.

2. Import mediapipe untuk memproses koordinat jari

pip install mediapipe

Sesetengah masalah mungkin berlaku pada masa ini, seperti openCV tiba-tiba menjadi tidak boleh digunakan. Tidak mengapa, nyahpasangnya dan muat turun semula.

butiran mediapipe: Tangan - mediapipe (google.github.io)

Cara menggunakan Python+OpenCV untuk mencapai kesan menyeret petak maya

Ringkasnya, ia akan mengembalikan kita 21 titik kunci jari Koordinat, iaitu, nisbah kedudukannya dalam skrin video (0~1), kami darabkannya dengan lebar dan ketinggian skrin yang sepadan untuk mendapatkan koordinat yang sepadan dengan jari.

Kali ini saya menggunakan hujung jari telunjuk dan jari tengah iaitu nombor 8 dan 12.

2.1 Konfigurasikan beberapa maklumat asas

import cv2
import time
import numpy as np
import mediapipe as mp
 
 
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands
 
hands =  mp_hands.Hands(
    static_image_mode=True,
    max_num_hands=2,
    min_detection_confidence=0.5)

2.2 Apabila memproses setiap bingkai imej, tambah

rreee

Apabila kita Apabila membaca setiap bingkai gambar dalam aliran video, ia ditukar daripada BGR ke RGB dan dibekalkan kepada objek tangan yang dijana oleh mediapipe untuk membaca Ia akan mengembalikan maklumat titik utama jari dalam gambar ini untuk melukis pada setiap bingkai gambar.

    frame.flags.writeable = False
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # 返回结果
    results = hands.process(frame)
 
    frame.flags.writeable = True
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

2.3 Kod lengkap langkah sehingga ke tahap ini

    # 如果结果不为空
    if results.multi_hand_landmarks:
 
        # 遍历双手(根据读取顺序,一只只手遍历、画画)
        for hand_landmarks in results.multi_hand_landmarks:
            mp_drawing.draw_landmarks(
                frame,
                hand_landmarks,
                mp_hands.HAND_CONNECTIONS,
                mp_drawing_styles.get_default_hand_landmarks_style(),
                mp_drawing_styles.get_default_hand_connections_style())

3 Pengiraan kedudukan

Percubaan kami memerlukan penyeretan kotak, jadi ke sana. mesti ada yang tidak menyeret masa, jadi kita juga boleh mendapatkan kedudukan hujung jari jari telunjuk (8) dan jari tengah (12) mengikut langkah sebelumnya bongkah mengikut kedudukan jari apabila bertepatan dengan bongkah.

Cara menggunakan Python+OpenCV untuk mencapai kesan menyeret petak maya

Kod penuh

Cara menggunakan Python+OpenCV untuk mencapai kesan menyeret petak maya

import cv2
import time
import numpy as np
import mediapipe as mp
 
 
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands
 
hands =  mp_hands.Hands(
    static_image_mode=True,
    max_num_hands=2,
    min_detection_confidence=0.5)
 
 
# 调用摄像头 0 默认摄像头 
cap = cv2.VideoCapture(0)
 
# 方块初始数组
x = 100
y = 100
w = 100
h = 100
 
 
# 读取一帧帧照片
while True:
    # 返回frame图片
    rec,frame = cap.read()
    
    # 镜像
    frame = cv2.flip(frame,1)
    
    
    
    frame.flags.writeable = False
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    # 返回结果
    results = hands.process(frame)
 
    frame.flags.writeable = True
    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
    
    
    # 如果结果不为空
    if results.multi_hand_landmarks:
 
        # 遍历双手(根据读取顺序,一只只手遍历、画画)
        # results.multi_hand_landmarks n双手
        # hand_landmarks 每只手上21个点信息
        for hand_landmarks in results.multi_hand_landmarks:
            mp_drawing.draw_landmarks(
                frame,
                hand_landmarks,
                mp_hands.HAND_CONNECTIONS,
                mp_drawing_styles.get_default_hand_landmarks_style(),
                mp_drawing_styles.get_default_hand_connections_style())
    
    
    # 画矩形 
    cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 255), -1)
 
    # 显示画面
    cv2.imshow('frame',frame)
    
    # 退出条件
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    
cap.release()
cv2.destroyAllWindows()

Atas ialah kandungan terperinci Cara menggunakan Python+OpenCV untuk mencapai kesan menyeret petak maya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam