/ / Tìm hiểu cách xác định và theo dõi bàn tay với OpenCV và Python

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.

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.

  Một bàn tay với các địa danh được đặt tên

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:

Pycharm IDE hiển thị các thông số mặc định của MediaPipe Hands

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:

Đầu ra của một chương trình với mỗi mốc được khoanh tròn

Sau đó, nó vẽ các kết nối tay:

Đầu ra của một chương trình theo dõi bàn 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:

Đầu ra của một chương trình theo dõi bàn tay

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.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *