Cytron Technologies
Giờ làm việc: 8:00 - 17:00
Thứ 2 - Thứ 6 (trừ ngày lễ)
Hotline 0362917357
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.
Đây là những module cần thiết để tải trên Jetson Nano trước khi hiển thị mã code Python.
(Đố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
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)