این پروژه کوتاه را بسازید و در کمترین زمان شروع به آزمایش بینایی کامپیوتری ردیابی دستی کنید.
ردیابی دست فرآیند استفاده از بینایی کامپیوتری برای تشخیص و پیگیری حرکات دست فرد در زمان واقعی است. بیشترین کاربرد ردیابی دست در هدست های واقعیت مجازی است. هدست ها به شما این امکان را می دهند که از دستان خود به عنوان ورودی به جای کنترلرهای لمسی استفاده کنید. این به نوبه خود تجربه را فراگیرتر می کند.
نحوه ردیابی دست های شخص را با استفاده از پایتون، OpenCV برای بینایی کامپیوتری و MediaPipe بیاموزید.
چارچوب MediaPipe چگونه دست ها را دنبال می کند؟
گوگل چارچوب MediaPipe را توسعه داد که شامل بسیاری از راه حل های یادگیری ماشینی است. یکی از راه حل ها راه حل ردیابی دست و انگشت به نام MediaPipe Hands است. برای ردیابی دست ها، MediaPipe Hands دو فرآیند را انجام می دهد: تشخیص کف دست و تشخیص نقطه عطف.
تشخیص کف دست
MediaPipe با شناسایی محل قرار گرفتن کف دست ها در تصویر ورودی شروع می شود. از آنجایی که تخمین جعبه های محدود کننده برای اجسام سفت ساده تر از شناسایی دست ها با انگشتان متصل است.
تشخیص نقاط دیدنی دست
پس از تشخیص کف دست، MediaPipe تشخیص نقاط عطف دست را انجام می دهد. مدل نقطه عطف دست می تواند 21 مختصات دقیق از مکان هر نشانه دست را پیش بینی کند.
اعداد نشان دهنده یک شناسه منحصر به فرد برای هر نقطه عطف هستند.
تنظیم محیط
برای پیگیری این پروژه باید با اصول اولیه پایتون آشنا باشید. کتابخانه های زیر را در محیط خود نصب کنید:
- OpenCV: شما از این کتابخانه برای بینایی کامپیوتر و انجام تکنیک های پردازش تصویر بر روی تصویر ورودی استفاده خواهید کرد.
- MediaPipe: شما از این کتابخانه برای انجام تشخیص و ردیابی دست روی تصویر ورودی استفاده خواهید کرد.
- imutils: شما این کتابخانه را برای تغییر اندازه فریم ویدیوی ورودی انتخاب می کنید.
دستور زیر را روی ترمینال خود اجرا کنید تا کتابخانه های OpenCV، MediaPipe و imutils را نصب کنید. در صورت نیاز pip – مدیر بسته پایتون – را نصب کنید. اطمینان حاصل کنید که کتابخانهها را بهعنوان فهرستی با فاصله محدود ارسال میکنید.
pip نصب OpenCV-Python MediaPipe imutils
وقتی آپدیت کامل شد محیط برای شروع کدنویسی آماده است.
کد منبع کامل این پروژه در آن موجود است
مخزن GitHub
.
واردات کتابخانه های مورد نیاز
شما باید کتابخانه هایی را که نصب کرده اید وارد کنید تا بتوانید از آنها استفاده کنید. هر IDE پایتون را باز کنید، یک فایل پایتون ایجاد کنید و واردهای زیر را اضافه کنید:
import cv2
import mediapipe as mp
import imutils
اطمینان حاصل کنید که OpenCV را به عنوان cv2 و MediaPipe را با حروف کوچک وارد کرده اید. اگر این کار را انجام ندهید یک خطا ایجاد می کند.
ایجاد اشیاء MediaPipe که در طول ردیابی استفاده خواهید کرد
شما از mpHands برای فراخوانی راه حل دست MediaPipe استفاده می کنید و دست ها برای تشخیص و ردیابی ورودی دست شی می کنند. شما از شی mpDraw برای رسم اتصالات بین نشانه های دست های شناسایی شده استفاده خواهید کرد.
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
شما می توانید مدل دست MediaPipe را با ارسال پارامترهای مختلف به سازنده Hands() تنظیم کنید. مقادیر پیشفرض برای این پروژه به اندازه کافی خوب هستند، اما میتوانید با آنها آزمایش کنید تا ببینید چگونه بر مدل تأثیر میگذارند:
شما باید static_image_mode را بهعنوان False رها کنید تا مطمئن شوید که مدل یک بار قبل از شروع ردیابی عقربهها را تشخیص میدهد. فقط در صورتی فرآیند ردیابی را تکرار می کند که اطمینان تشخیص کمتر از پارامتر اعلام شده باشد و پردازش ورودی کلی سریعتر شود.
انجام ردیابی دست
برای انجام ردیابی دستی به سه عملکرد نیاز دارید: یکی برای پردازش ورودی، یکی برای رسم اتصالات نقطه عطف دست، و یک تابع اصلی برای کنترل جریان برنامه.
تابع پردازش ورودی
این تابع ورودی را می گیرد، آن را به مقیاس خاکستری تبدیل می کند، و آن را به مدل دستی MediaPipe می دهد تا عقربه های ورودی را شناسایی و ردیابی کند.
# Processing the input image
def process_image(img):
# Converting the input to grayscale
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = hands.process(gray_image)
# Returning the detected hands to calling function
return results
این تابع نتایج مربوط به وجود عقربه های شناسایی شده در ورودی را برمی گرداند.
تابع ترسیم اتصالات نقطه عطف دست
این تابع بررسی می کند که آیا عملکرد پردازش ورودی، دستی را شناسایی کرده است یا خیر. اگر عقربهای شناسایی شده باشد، روی هر علامت مشخصه حلقه میزند و دایرهای دور آن میکشد و با استفاده از تابع شمارش پایتون، نقطه عطف را دنبال میکند. سپس اتصالات بین نشانه ها را در ورودی ویدیوی اصلی ترسیم می کند.
# Drawing landmark connections
def draw_hand_connections(img, results):
if results.multi_hand_landmarks:
for handLms in results.multi_hand_landmarks:
for id, lm in enumerate(handLms.landmark):
h, w, c = img.shape
# Finding the coordinates of each landmark
cx, cy = int(lm.x * w), int(lm.y * h)
# Printing each landmark ID and coordinates
# on the terminal
print(id, cx, cy)
# Creating a circle around each landmark
cv2.circle(img, (cx, cy), 10, (0, 255, 0),
cv2.FILLED)
# Drawing the landmark connections
mpDraw.draw_landmarks(img, handLms,
mpHands.HAND_CONNECTIONS)
return img
عملکرد با دور هر نقطه مشخص شروع می شود:
سپس اتصالات دست را ترسیم می کند:
در نهایت خروجی خود را به تابع فراخوانی برمی گرداند.
عملکرد اصلی
یک تابع اصلی ایجاد کنید که جریان برنامه شما را کنترل کند. برای اطمینان از سازگاری خروجی، ورودی را می گیرد و اندازه فریم ویدیو را تغییر می دهد. ورودی را به عملکرد پردازش ارسال کنید که سپس دست ها را شناسایی و ردیابی می کند. نتایج برگردانده شده را به تابع رسم اتصال نشانه های دستی ببرید که اتصال را روی ورودی ویدیوی اصلی ترسیم می کند. در نهایت خروجی را به کاربر نمایش می دهد.
def main():
# Replace 0 with the video path to use a
# pre-recorded video
cap = cv2.VideoCapture(0)
while True:
# Taking the input
success, image = cap.read()
image = imutils.resize(image, width=500, height=500)
results = process_image(image)
draw_hand_connections(image, results)
# Displaying the output
cv2.imshow("Hand tracker", image)
# Program terminates when q key is pressed
if cv2.waitKey(1) == ord('q'):
cap.release()
cv2.destroyAllWindows()
آخرین مرحله اجرای برنامه شماست. کد زیر تضمین می کند که وقتی برنامه را اجرا می کنید، ابتدا تابع اصلی اجرا می شود.
if __name__ == "__main__":
main()
هنگامی که برنامه اجرا می شود، خروجی مانند زیر تولید می کند:
این برنامه دست ها را در زمان واقعی ردیابی می کند.
ردیابی دستی برای واقعیت مجازی فراگیر
ردیابی دستی در واقعیت مجازی این فناوری را فریبنده تر می کند. هدست های واقعیت مجازی شروع به معرفی ردیابی دست کرده اند و حس واقعیت را به دنیای مجازی منتقل می کنند. هدست ها به کاربر اجازه می دهند تا دستورات را با استفاده از دست مجازی وارد کند.
ردیابی دست در هدست های مجازی تنها یکی از کاربردهای این فناوری است. شما می توانید ردیابی دست را در هر منطقه قابل اجرا که دوست دارید بگنجانید.