Tìm hiểu cách xác định và theo dõi bàn tay với OpenCV và Python
Theo dõi bàn tay là quá trình sử dụng thị giác máy tính để phát hiện và theo dõi chuyển động của bàn tay của một người trong thời gian thực. Ứng dụng phổ biến nhất của theo dõi bàn tay là trong tai nghe thực tế ảo. Tai nghe cho phép bạn sử dụng tay làm đầu vào thay cho bộ điều khiển cảm ứng. Điều này lần lượt làm cho trải nghiệm đắm chìm hơn.
Tìm hiểu cách theo dõi bàn tay của một người bằng Python, OpenCV cho thị giác máy tính và MediaPipe.
Google đã phát triển khung MediaPipe, trong đó có nhiều giải pháp máy học. Một trong những giải pháp là giải pháp theo dõi bàn tay và ngón tay có tên MediaPipe Hands. Để theo dõi bàn tay, MediaPipe Hands thực hiện hai quy trình: phát hiện lòng bàn tay và phát hiện mốc.
Mục Lục
Phát hiện lòng bàn tay
MediaPipe bắt đầu bằng cách xác định vị trí của lòng bàn tay trong hình ảnh đầu vào. Vì việc ước tính các hộp giới hạn cho các vật thể cứng đơn giản hơn so với việc xác định bàn tay bằng các ngón tay có khớp.
Phát hiện mốc tay
Sau khi phát hiện lòng bàn tay, MediaPipe thực hiện phát hiện mốc bàn tay. Mô hình mốc tay có thể dự đoán 21 tọa độ chính xác của vị trí của từng mốc tay.
Các con số đại diện cho một định danh duy nhất cho mỗi mốc.
Thiết lập môi trường của bạn
Để theo dõi dự án này, bạn nên làm quen với những kiến thức cơ bản về Python. Cài đặt các thư viện sau trong môi trường của bạn:
- OpenCV: Bạn sẽ sử dụng thư viện này cho thị giác máy tính và thực hiện các kỹ thuật xử lý hình ảnh trên hình ảnh đầu vào.
- MediaPipe: Bạn sẽ sử dụng thư viện này để thực hiện phát hiện và theo dõi bàn tay trên hình ảnh đầu vào.
- imutils: Bạn sẽ sử dụng thư viện này để thay đổi kích thước khung video của đầu vào.
Chạy lệnh sau trên thiết bị đầu cuối của bạn để cài đặt thư viện OpenCV, MediaPipe và imutils. Cài đặt pip—trình quản lý gói Python—nếu bạn cần. Đảm bảo bạn chuyển các thư viện dưới dạng danh sách được phân cách bằng dấu cách.
pip install OpenCV-Python MediaPipe imutils
Khi cập nhật hoàn tất, môi trường đã sẵn sàng để bạn bắt đầu viết mã.
Nhập các thư viện cần thiết
Bạn sẽ cần nhập các thư viện mà bạn đã cài đặt để có thể sử dụng chúng. Mở bất kỳ IDE Python nào, tạo tệp Python và thêm các mục nhập sau:
import cv2
import mediapipe as mp
import imutils
Đảm bảo bạn nhập OpenCV dưới dạng cv2 và MediaPipe ở dạng chữ thường. Không làm như vậy sẽ ném một lỗi.
Bạn sẽ sử dụng mpHands để gọi giải pháp tay MediaPipe và đối tượng tay để phát hiện và theo dõi đầu vào tay. Bạn sẽ sử dụng đối tượng mpDraw để vẽ các kết nối giữa các điểm mốc của bàn tay đã xác định.
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
Bạn có thể tinh chỉnh mô hình tay MediaPipe bằng cách chuyển các tham số khác nhau cho hàm tạo Hands(). Các giá trị mặc định là đủ tốt cho dự án này, nhưng bạn có thể thử nghiệm với chúng để xem chúng ảnh hưởng đến mô hình như thế nào:
Bạn nên để lại static_image_mode là Sai để đảm bảo mô hình phát hiện các bàn tay một lần trước khi bắt đầu theo dõi chúng. Nó chỉ lặp lại quy trình theo dõi nếu độ tin cậy phát hiện giảm xuống thấp hơn tham số đã khai báo, giúp quá trình xử lý đầu vào tổng thể nhanh hơn.
Thực hiện theo dõi tay
Bạn cần ba chức năng để thực hiện theo dõi tay: một để xử lý đầu vào, một để vẽ các kết nối mốc của tay và một chức năng chính để kiểm soát luồng chương trình.
Chức năng xử lý đầu vào
Hàm này nhận đầu vào, chuyển đổi nó thành thang độ xám và chuyển nó sang mô hình kim MediaPipe để phát hiện và theo dõi các kim trong đầu vào.
def process_image(img):
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = hands.process(gray_image)
return results
Hàm trả về kết quả về việc có bất kỳ bàn tay nào được phát hiện trên đầu vào hay không.
Chức năng vẽ kết nối mốc tay
Chức năng này kiểm tra xem chức năng xử lý đầu vào có phát hiện bất kỳ bàn tay nào không. Nếu có bất kỳ bàn tay nào được phát hiện, nó sẽ lặp qua từng mốc và vẽ một vòng tròn xung quanh mốc đó, theo dõi mốc đó bằng cách sử dụng hàm liệt kê của Python. Sau đó, nó vẽ các kết nối giữa các mốc trên đầu vào video gốc.
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
cx, cy = int(lm.x * w), int(lm.y * h)
print(id, cx, cy)
cv2.circle(img, (cx, cy), 10, (0, 255, 0),
cv2.FILLED)
mpDraw.draw_landmarks(img, handLms,
mpHands.HAND_CONNECTIONS)
return img
Chức năng bắt đầu bằng cách khoanh tròn từng mốc:
Sau đó, nó vẽ các kết nối tay:
Cuối cùng, nó trả lại đầu ra của nó cho chức năng gọi.
Chức năng chính
Tạo một chức năng chính sẽ kiểm soát luồng chương trình của bạn. Nó sẽ lấy đầu vào và thay đổi kích thước khung hình video để đảm bảo tính nhất quán của đầu ra. Chuyển đầu vào cho chức năng xử lý, chức năng này sau đó sẽ phát hiện và theo dõi các bàn tay. Đưa kết quả trả về đến chức năng vẽ kết nối mốc bằng tay, chức năng này sẽ vẽ kết nối trên đầu vào video gốc. Cuối cùng nó sẽ hiển thị đầu ra cho người dùng.
def main():
cap = cv2.VideoCapture(0) while True:
success, image = cap.read()
image = imutils.resize(image, width=500, height=500)
results = process_image(image)
draw_hand_connections(image, results)
cv2.imshow("Hand tracker", image)
if cv2.waitKey(1) == ord('q'):
cap.release()
cv2.destroyAllWindows()
Bước cuối cùng là chạy chương trình của bạn. Đoạn mã dưới đây đảm bảo rằng khi bạn chạy chương trình, chức năng chính sẽ chạy trước.
if __name__ == "__main__":
main()
Khi chương trình chạy, nó cho ra kết quả như sau:
Chương trình theo dõi bàn tay trong thời gian thực.
Theo dõi tay cho thực tế ảo nhập vai
Theo dõi bàn tay trong thực tế ảo làm cho công nghệ trở nên hấp dẫn hơn. Tai nghe thực tế ảo đã bắt đầu giới thiệu tính năng theo dõi bàn tay, mang lại cảm giác thực tế cao hơn cho thế giới ảo. Tai nghe cho phép người dùng nhập lệnh bằng tay ảo.
Theo dõi tay trong tai nghe ảo chỉ là một ứng dụng của công nghệ này. Bạn có thể kết hợp theo dõi bàn tay trong bất kỳ khu vực áp dụng nào theo ý thích của mình.