Khái niệm nhận diện bàn tay Nhận diện bàn tay là quá trình sử dụng các thuật toán và công cụ phần mềm để phát hiện và theo dõi các cử chỉ, chuyển động hoặc hình dạng của bàn tay tr
Trang 1TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI
KHOA ĐIỆN - ĐIỆN TỬ
BỘ MÔN ĐIỀU KHIỂN HỌC
***********
BÁO CÁO
XỬ LÝ ẢNH TRONG CÔNG NGHIỆP
Đề tài : Ứng dụng xử lý ảnh nhận diện ngón tay
Giảng viên hướng dẫn : TS Nguyễn Hoàng Vân
Người thực hiện đề tài : Phú Minh Đức
Hà Nội, 05 /12/2024.
Trang 2Mục Lục
1 TỔNG QUAN VỀ ĐỀ TÀI 3
1.1 Lý do chọn đề tài 3
1.2 Khái niệm nhận diện bàn tay 3
1.3 Xử lý ảnh và OpenCV 4
1.4 Nhiệm vụ của đề tài 4
2 NỘI DUNG THỰC HIỆN 5
2.1 Nhận diện phát hiện bàn tay bằng Python 5
2.1.1 Tiền xử lý 5
2.1.2 Phát hiện nhận diện ngón tay 6
2.1.3 Nhận dạng ký hiệu 7
2.1.4 Minh Họa 7
2.2 Chi tiết thuật toán 8
2.2.1 Triển khai 8
2.2.2 Phân tích thuật toán 11
2.1.3 Phân tích độ hiệu quả 18
3 KẾT LUẬN 18
3.1 Khả năng ứng dụng vào hệ thống thực 18
3.2 Kết luận 19
3.3 Hướng phát triển 19
Trang 31 TỔNG QUAN VỀ ĐỀ TÀI
1.1 Lý do chọn đề tài
Nhận diện cử chỉ bàn tay là một lĩnh vực nghiên cứu đầy hứa hẹn trong công nghệ giao tiếp không tiếp xúc, đặc biệt trong bối cảnh thế giới ngày càng chú trọng đến việc tạo ra các phương thức giao tiếp và điều khiển thiết bị mà không cần tiếp xúc trực tiếp Điều này không chỉ tạo ra những giải pháp thú vị trong công nghệ mà còn giúp tối ưu hóa quy trình làm việc, bảo vệ sức khỏe con người và mở rộng khả năng tương tác giữa người và máy Việc sử dụng công nghệ nhận diện bàn tay mang lại những lợi ích to lớn trong các hệ thống điều khiển, từ điều khiển thiết bị thông minh cho đến hỗ trợ người khuyết tật
Tuy nhiên, hầu hết các giải pháp truyền thống yêu cầu phần cứng đắt tiền và phức tạp, gây trở ngại cho việc ứng dụng rộng rãi Chính vì vậy, việc áp dụng các công nghệ phần mềm mã nguồn mở như Python kết hợp với thư viện OpenCV là một bước đi hợp lý để đơn giản hóa và tiết kiệm chi phí Với hệ thống này, người dùng
có thể tương tác trực tiếp với các thiết bị mà không cần các công cụ đắt tiền, chỉ cần một máy tính hoặc điện thoại thông minh có camera Đây là lý do khiến đề tài
"Nhận diện ngón tay và cử chỉ bàn tay sử dụng OpenCV và Python" trở thành một hướng đi sáng tạo và thực tế
1.2 Khái niệm nhận diện bàn tay
Nhận diện bàn tay là quá trình sử dụng các thuật toán và công cụ phần mềm để phát hiện và theo dõi các cử chỉ, chuyển động hoặc hình dạng của bàn tay trong không gian ba chiều Đây là một phần quan trọng trong lĩnh vực thị giác máy tính (Computer Vision), nơi các máy tính và hệ thống tự động có thể "nhìn thấy" và phân tích thông tin từ hình ảnh hoặc video Các cử chỉ bàn tay có thể bao gồm các hành động đơn giản như giơ ngón tay, vẫy tay, hoặc thậm chí là các cử động phức tạp như nắm tay, mở tay
Trong việc nhận diện bàn tay, các thuật toán cần phải phân tích hình ảnh từ camera
để phát hiện các đặc trưng của bàn tay, từ đó đưa ra các quyết định như nhận diện các ngón tay, xác định các động tác bàn tay, hoặc phát hiện các sự kiện như nắm tay, mở tay Hệ thống nhận diện cử chỉ bàn tay có thể sử dụng các điểm đặc trưng
Trang 4của ngón tay (landmarks) để phân tích và đưa ra các kết quả, từ đó điều khiển các thiết bị hoặc hệ thống một cách chính xác
1.3 Xử lý ảnh và OpenCV
OpenCV (Open Source Computer Vision Library) là một thư viện mã nguồn mở cực kỳ mạnh mẽ được sử dụng để xử lý ảnh và thị giác máy tính OpenCV cung cấp hàng loạt các công cụ để thực hiện các nhiệm vụ xử lý ảnh như nhận diện đối tượng, phát hiện khuôn mặt, phân đoạn hình ảnh và nhận diện các chuyển động, giúp máy tính có thể hiểu và xử lý thông tin từ thế giới xung quanh thông qua hình ảnh Với các thuật toán tối ưu và khả năng chạy nhanh trên nhiều nền tảng khác nhau, OpenCV trở thành công cụ lý tưởng cho các ứng dụng nhận diện hình ảnh Trong đề tài này, OpenCV đóng vai trò cốt lõi trong việc phát hiện và nhận diện bàn tay Quá trình này bao gồm các bước như: tiền xử lý hình ảnh, phát hiện các đối tượng trong hình ảnh, theo dõi các điểm đặc trưng của ngón tay và cuối cùng là phân tích cử chỉ Hệ thống sử dụng các phương pháp như chuyển đổi ảnh sang ảnh xám (grayscale), lọc nhiễu, phát hiện các cạnh trong hình ảnh và các kỹ thuật học máy để tăng cường hiệu quả nhận diện trong các điều kiện môi trường khác nhau
1.4 Nhiệm vụ của đề tài
Đề tài này có các nhiệm vụ quan trọng nhằm xây dựng và triển khai hệ thống nhận diện ngón tay, giúp điều khiển các thiết bị hoặc hệ thống bằng cử chỉ bàn tay Các nhiệm vụ cụ thể bao gồm:
Xây dựng hệ thống nhận diện bàn tay:
Phát triển hệ thống phần mềm sử dụng Python và OpenCV để phát hiện và theo dõi bàn tay trong không gian ba chiều Việc phát hiện bàn tay là bước đầu tiên và cực kỳ quan trọng để phân tích các cử chỉ ngón tay Hệ thống phải có khả năng nhận diện bàn tay trong các điều kiện ánh sáng khác nhau và xử lý hình ảnh từ camera một cách hiệu quả
1 Xác định số ngón tay giơ lên:
Sau khi bàn tay được nhận diện, hệ thống tiếp tục xác định số ngón tay giơ lên để đưa ra các lệnh điều khiển tương ứng Việc xác định số lượng ngón tay giơ lên có thể được thực hiện thông qua việc phân tích các điểm
Trang 5các ngón tay, bao gồm cả các trường hợp khi ngón tay đang ở vị trí khác nhau hoặc có sự che khuất
2 Tích hợp hệ thống điều khiển dựa trên cử chỉ:
Sau khi xác định số ngón tay giơ lên, hệ thống sẽ thực hiện các lệnh điều khiển Mỗi số lượng ngón tay giơ lên sẽ tương ứng với một hành động nhất định, như dừng lại, quay phải, quay trái, tăng tốc, v.v Mục tiêu là tạo ra một hệ thống dễ sử dụng và dễ hiểu, giúp người dùng có thể điều khiển các thiết bị hoặc ứng dụng thông qua cử chỉ đơn giản
3 Tối ưu hóa hệ thống:
Để đảm bảo hệ thống hoạt động hiệu quả trong các điều kiện khác nhau, việc tối ưu hóa hệ thống là rất quan trọng Điều này bao gồm việc cải thiện tốc độ xử lý, độ chính xác của nhận diện, và khả năng phản hồi nhanh chóng đối với các thay đổi trong cử chỉ của người dùng Hệ thống cần phải đáp ứng được các yêu cầu thực tế về hiệu suất và khả năng mở rộng
4 Đánh giá hiệu quả hệ thống:
Hệ thống sẽ được thử nghiệm và đánh giá trong các tình huống thực tế để kiểm tra độ chính xác và hiệu suất Những kết quả thu được sẽ giúp đưa
ra các đánh giá về khả năng ứng dụng của hệ thống và những cải tiến cần thiết để nâng cao hiệu quả hoạt động của hệ thống
2 NỘI DUNG THỰC HIỆN
2.1 Nhận diện phát hiện bàn tay bằng Python
2.1.1 Tiền xử lý
Quá trình tiền xử lý đóng vai trò quan trọng trong việc tối ưu hóa chất lượng hình ảnh và tăng độ chính xác trong việc nhận diện bàn tay Các bước tiền xử lý bao gồm:
Chuyển đổi ảnh sang ảnh xám (grayscale):
Việc chuyển đổi ảnh màu sang ảnh xám giúp giảm bớt độ phức tạp của ảnh, làm tăng tốc độ xử lý và tập trung vào các đặc trưng quan trọng của hình
Trang 6ảnh Đây là bước đầu tiên trong xử lý hình ảnh, giúp loại bỏ các yếu tố không cần thiết và dễ dàng phân tích các đối tượng trong hình ảnh
Lọc nhiễu (Noise Filtering):
Trong quá trình thu thập hình ảnh từ camera, ảnh có thể bị nhiễu do điều kiện ánh sáng kém hoặc sự chuyển động nhanh Sử dụng các bộ lọc như Gaussian Blur giúp làm mịn ảnh và loại bỏ các nhiễu không mong muốn, làm cho quá trình nhận diện trở nên chính xác hơn
Phát hiện các cạnh (Edge Detection):
Các thuật toán như Canny hoặc Sobel được sử dụng để phát hiện các cạnh trong ảnh, giúp xác định các đối tượng trong hình ảnh Phát hiện cạnh giúp nhận diện rõ ràng các đặc trưng của bàn tay, đặc biệt là các ngón tay
Điều chỉnh độ sáng và độ tương phản (Brightness and Contrast
Adjustment):
Điều chỉnh độ sáng và độ tương phản giúp cải thiện chất lượng hình ảnh trong các điều kiện ánh sáng không đồng đều, đồng thời làm nổi bật các đặc trưng của bàn tay và ngón tay
2.1.2 Phát hiện nhận diện ngón tay
Sau khi tiền xử lý, hệ thống sử dụng các thuật toán của OpenCV để phát hiện bàn tay và xác định vị trí các điểm đặc trưng của ngón tay Các bước này bao gồm:
Phát hiện bàn tay:
OpenCV sử dụng các phương pháp như Haar cascades hoặc các mô hình học máy để phát hiện bàn tay trong ảnh Điều này bao gồm việc nhận diện các đặc trưng của bàn tay và phân biệt giữa bàn tay và các đối tượng khác trong hình ảnh
Theo dõi các điểm đặc trưng (landmarks):
Các thuật toán của OpenCV hoặc thư viện như MediaPipe giúp phát hiện và theo dõi các điểm đặc trưng của ngón tay Các điểm này có thể bao gồm các
vị trí của các khớp ngón tay, giúp xác định số ngón tay giơ lên
Xác định số ngón tay giơ lên:
Dựa trên các điểm đặc trưng, hệ thống xác định số ngón tay giơ lên để đưa
Trang 7ra các lệnh điều khiển tương ứng Việc này đòi hỏi sự chính xác cao trong việc theo dõi các ngón tay, kể cả khi chúng di chuyển hoặc bị che khuất
2.1.3 Nhận dạng ký hiệu
Sau khi xác định số ngón tay giơ lên, hệ thống nhận dạng các ký hiệu và thực hiện các lệnh điều khiển Các ký hiệu này có thể bao gồm:
Số ngón tay giơ lên:
Mỗi số ngón tay giơ lên sẽ tương ứng với một hành động khác nhau Ví dụ, khi có 0 ngón tay giơ lên, hệ thống sẽ thực hiện lệnh "STOP", khi có 1 ngón tay giơ lên, lệnh "TURN RIGHT" sẽ được thực thi, và tương tự với các số ngón tay còn lại
Tạo ra lệnh điều khiển:
Sau khi nhận dạng được số ngón tay giơ lên, hệ thống sẽ chuyển tiếp lệnh điều khiển đến thiết bị hoặc ứng dụng cần tương tác Việc này giúp người dùng có thể dễ dàng điều khiển các hệ thống bằng các cử chỉ đơn giản
2.1.4 Minh Họa
Minh họa bằng hình ảnh
Khung hình chính:
Góc trên trái: Hiển thị hình minh họa (hình ngón tay từ thư mục Fingers).
Góc trên phải: Lệnh điều khiển (STOP, TURN RIGHT, v.v.).
Trang 8 Giữa màn hình: Các landmark và bàn tay người được hiển thị.
Nếu bạn cần thêm hình ảnh minh họa thực tế hoặc chi tiết kỹ thuật, mình sẵn sàng
hỗ trợ!
2.2 Chi tiết thuật toán
2.2.1 Triển khai
import cv2
import time
import os
import HandTrackingModule as htm #khai báo các thư viện sử dụng
# Khởi động camera
cap = cv2.VideoCapture(0) # Mở camera mặc định (ID 0) để bắt đầu thu hình
# Tải hình ảnh từ thư mục "Fingers"
FolderPath = "Fingers" # Đường dẫn tới thư mục chứa hình ảnh
lst = os.listdir(FolderPath) # Lấy danh sách các tệp tin trong thư mục "Fingers" lst_2 = [] # Tạo danh sách rỗng để lưu các mảng ảnh
for i in lst: # Lặp qua từng tên tệp tin trong danh sách
image = cv2.imread(f"{FolderPath}/{i}") # Đọc từng file ảnh trong thư mục
"Fingers"
lst_2.append(image) # Thêm ảnh vừa đọc vào danh sách lst_2
# Biến thời gian để tính FPS
pTime = 0 # Biến lưu thời gian khung hình trước đó, dùng để tính FPS
# Tạo đối tượng phát hiện bàn tay
detector = htm.handDetector(detectionCon=0.75) # Khởi tạo lớp handDetector với
độ chính xác nhận diện tối thiểu 75%
# Danh sách các điểm landmark đại diện cho đầu ngón tay
Trang 9fingerid = [4, 8, 12, 16, 20] # Landmark cho ngón cái, ngón trỏ, ngón giữa, ngón
áp út, ngón út
# Từ điển thông báo lệnh theo số ngón tay
commands = { # Định nghĩa các lệnh điều khiển tương ứng với số ngón tay giơ lên
0: "STOP", # 0 ngón tay: Dừng
1: "TURN RIGHT", # 1 ngón tay: Rẽ phải
2: "TURN LEFT", # 2 ngón tay: Rẽ trái
3: "GO BACKWARD", # 3 ngón tay: Lùi lại
4: "SLOW DOWN", # 4 ngón tay: Chậm lại
5: "SPEED UP", # 5 ngón tay: Tăng tốc
}
while True: # Vòng lặp chính của chương trình
ret, frame = cap.read() # Đọc khung hình từ camera
frame = detector.findHands(frame) # Phát hiện bàn tay và vẽ lên khung hình lmList = detector.findPosition(frame, draw=False) # Lấy danh sách các vị trí landmark trên bàn tay
if len(lmList) != 0: # Nếu phát hiện được bàn tay (lmList không rỗng)
fingers = [] # Tạo danh sách lưu trạng thái các ngón tay (mở hoặc đóng) # Xử lý ngón cái
if lmList[fingerid[0]][1] < lmList[fingerid[0] - 1][1]: # Nếu điểm landmark của ngón cái nằm bên trái khớp
fingers.append(1) # Ngón cái mở
else:
Trang 10fingers.append(0) # Ngón cái đóng
# Xử lý 4 ngón còn lại
for id in range(1, 5): # Lặp qua các ngón từ ngón trỏ đến ngón út
if lmList[fingerid[id]][2] < lmList[fingerid[id] - 2][2]: # Kiểm tra vị trí đầu ngón và khớp
fingers.append(1) # Ngón tay mở
else:
fingers.append(0) # Ngón tay đóng
# Đếm số ngón tay đang mở
songontay = fingers.count(1) # Đếm số lượng số '1' trong danh sách fingers # Hiển thị hình ảnh tương ứng với số ngón tay
if songontay > 0 and songontay <= len(lst_2): # Nếu số ngón tay nằm trong phạm vi có ảnh
h, w, c = lst_2[songontay - 1].shape # Lấy kích thước của ảnh tương ứng frame[0:h, 0:w] = lst_2[songontay - 1] # Đặt ảnh lên góc trên bên trái của khung hình
# Hiển thị lệnh điều khiển trên góc phải màn hình
cv2.rectangle(frame, (frame.shape[1] - 300, 0), (frame.shape[1], 50), (0, 255, 0), -1) # Vẽ hình chữ nhật
cv2.putText( # Hiển thị lệnh điều khiển
frame,
commands.get(songontay, "UNKNOWN"), # Lấy lệnh tương ứng từ từ điển hoặc hiển thị "UNKNOWN"
(frame.shape[1] - 290, 35), # Tọa độ của văn bản
Trang 11cv2.FONT_HERSHEY_SIMPLEX, # Font chữ
0.7, # Kích thước chữ
(255, 0, 0), # Màu chữ (xanh dương)
2, # Độ dày của chữ
)
# Tính FPS
cTime = time.time() # Lấy thời gian hiện tại
fps = 1 / (cTime - pTime) # Tính FPS (số khung hình/giây)
pTime = cTime # Cập nhật thời gian của khung hình hiện tại
cv2.putText(frame, f"FPS: {int(fps)}", (150, 70),
cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3) # Hiển thị FPS trên khung hình # Thu nhỏ khung hình và hiển thị
frame_resized = cv2.resize(frame, (640, 480)) # Thu nhỏ kích thước khung hình cv2.imshow("window", frame_resized) # Hiển thị khung hình trên cửa sổ
"window"
# Nhấn 'q' để thoát chương trình
if cv2.waitKey(1) == ord("q"): # Nếu phím 'q' được nhấn
break # Thoát vòng lặp
# Giải phóng tài nguyên và đóng cửa sổ
cap.release() # Dừng camera
cv2.destroyAllWindows() # Đóng tất cả các cửa sổ hiển thị
2.2.2 Phân tích thuật toán
a Import thư viện và thiết lập ban đầu
import cv2
Trang 12import os
import time
import HandTrackingModule as htm
cv2: Thư viện xử lý ảnh và video.
os: Dùng để thao tác với hệ thống tệp (đọc thư mục chứa hình ảnh minh
họa)
time: Để tính FPS (khung hình trên giây).
HandTrackingModule: Một module tùy chỉnh, sử dụng để phát hiện bàn
tay và các điểm landmark trên bàn tay
b Tải và xử lý dữ liệu hình ảnh minh họa
FolderPath = "Fingers"
lst = os.listdir(FolderPath)
finger_images = [cv2.imread(f"{FolderPath}/{img}") for img in lst]
FolderPath: Thư mục chứa các hình ảnh minh họa số ngón tay giơ lên (0-5).
os.listdir(FolderPath): Liệt kê các tệp trong thư mục Fingers.
cv2.imread(): Đọc từng tệp hình ảnh từ thư mục và lưu vào danh sách
finger_images
c Khởi tạo các biến và công cụ cần thiết
pTime = 0
detector = htm.handDetector(detectionCon=0.75)
fingerid = [4, 8, 12, 16, 20]