Cytron Technologies

Giờ làm việc: 8:00 - 17:00

Thứ 2 - Thứ 6 (trừ ngày lễ)

Hotline 0362917357 

ai virtual keyboard with nvidia jetson nano

Bàn Phím Ảo AI với NVIDIA Jetson Nano

NVIDIA Jetson Nano là một máy tính mini có thể thực hiện ứng dụng Trí Tuệ Nhân Tạo như phân loại hình ảnh, phân đoạn, sử lý giọng nói, và phát hiện vật thể. Trong phần hướng dẫn này OpenCV và CVZone sẽ được sử dụng để tạo bàn phím ảo Al bằng cách sử dụng ngôn ngữ Python trong Visual Studio Code với NVIDIA Jetson Nano. Thay vì sử dụng bàn phím vật lý, bàn phím ảo AI cho phép người dùng gõ trên màn hình bằng cử chỉ tay với sự hỗ trợ của máy ảnh.

Đối với hướng dẫn này, mình đã thử sử dụng NVIDIA Jetson Nano B01 và NVIDIA Jetson Nano 2GB, cả hai đều cho ra cùng một kết quả. Do đó bạn có thể sử dụng B01 hoặc 2GB để tạo ra bàn phím ảo Al.

Phần Cứng

Chuẩn Bị Module

Đây là những module cần thiết để tải trên Jetson Nano trước khi hiển thị mã code Python.

  • OpenCV 
  • MediaPipe
  • CVZone (must be 1.4.1 version)
  • Pynput
  1. Mở “Terminal”.
  2. Nhấn dòng hướng dẫn bên dưới để cài đặt module cần thiết :

(Đối với những người chưa cài đặt pip)

$ sudo apt-get install python3-pip

(Bắt đầu từ đây)

$ sudo pip3 install pip --upgrade

$ sudo pip3 install opencv_contrib_python

$ sudo apt install curl

$ sudo pip3 install opencv-python dataclasses

$ sudo apt install libcanberra-gtk-module libcanberra-gtk3-module

$ pip3 install cvzone == 1.4.1

$ pip install pynput

$ git clone https://github.com/PINTO0309/mediapipe-bin && cd mediapipe-bin

$ ./v0.8.5/numpy119x/mediapipe-0.8.5_cuda102-cp36-cp36m-linux_aarch64_numpy119x_jetsonnano_L4T32.5.1_download.sh

$ sudo pip3 install \

numpy-1.19.4-cp36-none-manylinux2014_aarch64.whl \

mediapipe-0.8.5_cuda102-cp36-none-linux_aarch64.whl

Viết Code Python

Sao chép mã Python và dán vào bất kỳ Python IDE nào (Môi Trường Phát Triển Tích Hợp).

import cv2
from cvzone.HandTrackingModule import HandDetector
from time import sleep
import cvzone
from pynput.keyboard import Controller

cap = cv2.VideoCapture(0)
cap.set(3, 1280)
cap.set(4, 720)

detector = HandDetector(detectionCon=0.8)
keys = [["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
        ["A", "S", "D", "F", "G", "H", "J", "K", "L", ";"],
        ["Z", "X", "C", "V", "B", "N", "M", ",", ".", "/"]]
finalText = ""

keyboard = Controller()


def drawALL(img, buttonList):

    for button in buttonList:
        x, y = button.pos
        w, h = button.size
        cvzone.cornerRect(
            img, (button.pos[0], button.pos[1], button.size[0], button.size[1]), 20, rt=0, colorC=(32, 218, 165))
        cv2.rectangle(img, button.pos, (x+w, y+h), (0, 0, 0), cv2.FILLED)
        cv2.putText(img, button.text, (x+5, y+40),
                    cv2.FONT_HERSHEY_PLAIN, 3, (0, 215, 255), 5)
    return img


class Button():
    def __init__(self, pos, text, size=[50, 50]):
        self.pos = pos
        self.size = size
        self.text = text


buttonList = []

for i in range(len(keys)):
    for j, key in enumerate(keys[i]):
        buttonList.append(Button([60 * j + 25, 60 * i + 30], key))

while True:
    success, img = cap.read()

    img = detector.findHands(img)
    lmList, bboxInfo = detector.findPosition(img)

    img = drawALL(img, buttonList)

    if lmList:
        for button in buttonList:
            x, y = button.pos
            w, h = button.size

            # check is finger within the x&y axis button box
            if x < lmList[8][0] < x + w and y < lmList[8][1] < y + h:
                cv2.rectangle(img, button.pos, (x+w, y+h),
                              (204, 197, 194), cv2.FILLED)
                cv2.putText(img, button.text, (x+5, y+40),
                            cv2.FONT_HERSHEY_PLAIN, 3, (88, 179, 197), 5)

                l, _, _ = detector.findDistance(8, 12, img, draw=False)
                print(l)

                # when clicked
                if l < 30:
                    keyboard.press(button.text)
                    cv2.rectangle(img, button.pos, (x+w, y+h),
                                  (0, 215, 255), cv2.FILLED)
                    cv2.putText(img, button.text, (x+5, y+40),
                                cv2.FONT_HERSHEY_PLAIN, 3, (0, 0, 0), 5)
                    finalText += button.text
                    sleep(0.15)

    cv2.rectangle(img, (50, 350), (600, 450), (88, 179, 197), cv2.FILLED)
    cv2.putText(img, finalText, (60, 425),
                cv2.FONT_HERSHEY_PLAIN, 5, (255, 255, 255), 5)

    cv2.imshow("Image", img)
    cv2.waitKey(1)

Hướng Dẫn

  1. Di chuyển đầu ngón tay của bạn trên ô chữ cái để chọn chữ cái mong muốn.
  2. Đặt đầu ngón trỏ và đầu ngón giữa gần nhau để bấm bàn phím và gõ chữ cái đó.
    (**Xin lưu ý: Chỉ cần đặt cả hai đầu ngón tay lại gần nhau khi bạn muốn gõ chữ cái.
  3. Bạn có thể gõ ký tự trên bất kỳ tệp nào , thanh tìm kiếm,v.v bằng cách sử dụng chương trình này.

Tham Khảo

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận