1. Trang chủ
  2. » Giáo Dục - Đào Tạo

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

20 0 0
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 1,34 MB

Nội dung

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 1

TRƯỜ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 2

Mụ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 3

1 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 4

củ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 5

cá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 7

ra 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 9

fingerid = [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 10

fingers.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 11

cv2.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 12

import 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]

Ngày đăng: 30/12/2024, 20:31

w