Rumah > Artikel > pembangunan bahagian belakang > Cara menggunakan Python+OpenCV untuk mencapai kesan menyeret petak maya
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.
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.
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.
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)
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
rreeeApabila 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())
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.
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!