Nhận diện khuôn mặt với OpenCV trên Raspberry Pi (Phần 1)
16:20 - 13/03/2019
Nhận diện khuôn mặt với OpenCV trên Raspberry Pi (Phần 1)
NVIDIA Jetson AGX Orin Hardware Layout and GPIO Expansion Header Pinout
NVIDIA Jetson là nền tảng hàng đầu thế giới dành cho Trí tuệ nhân tạo (AI) và Deep Learning
Cách sử dụng Camera CSI với hệ điều hành Raspberry Pi Bulleyes mới nhất
Jetson Stats dùng cho Giám sát và Điều khiển trên NVIDIA Jetson Ecosystem [Xavier NX, Nano, AGX Xavier, TX1, TX2]
Nhận diện khuôn mặt với OpenCV trên Raspberry Pi (Phần 1)
Xin chào các bạn!
Ở phần trước mình đã hướng dẫn các bạn cài đặt thư viện Opencv dùng cho việc xử lý ảnh. Cụ thể hôm nay mình sẽ giới thiệu đến các bạn một số tính năng cơ bản như nhận diện khuôn mặt với đầu vào là một ảnh và hình ảnh thu được trực tiếp từ Camera. Camera cho Raspberry Pi (Link here).
Đầu tiên chúng ta cần tải xuống tệp sau từ Github :
https://github.com/opencv/opencv/tree/master/data/haarcascades
Chúng ta cần sử dụng 2 tệp xml ở đây là :
+ haarcascade_frontalface_default.xml : để nhận diện khuôn mặt
+ haarcascade_eye.xml : để nhận diện mắt
1. Nhận diện khuôn mặt từ một ảnh.
Các bạn cần chuẩn bị một hình ảnh khuôn mặt ( một hoặc nhiều đều ok ). Ở đây mình sử dụng một ảnh với tên là "obama.jpg".
Các bạn copy 2 file trên ra Desktop của các bạn sau đó các bạn mở Terminal lên thực hiện thao tác sau :
cd Desktop/ sudo nano face.py |
Chúng ta vừa tạo ra một file Python có tên là " face.py ". Sau đó các bạn gõ đoạn code sau :
import cv2 #Tải một tập tin mô hình nhận diện khuôn mặt và nhận diện mắt face_cascade = cv2.CascadeClassifier('/home/pi/Desktop/haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('/home/pi/Desktop/haarcascade_eye.xml') #Đọc hình ảnh đầu vào img = cv2.imread("obama.jpg") gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Tìm kiếm các khuôn mặt trong ảnh bằng cách sử dụng file mô hình nhận diện khuôn mặt đã được tải lên faces = face_cascade.detectMultiScale(gray_img, scaleFactor= 1.3, minNeighbors= 5, minSize = (100, 100), flags = cv2.CASCADE_SCALE_IMAGE) print(type(faces)) print(faces) #Vẽ một hình chữ nhật xung quanh mỗi khuôn mặt được tìm thấy for x,y,w,h in faces: roi_gray = gray_img[y:y + h, x:x + w] roi_color = img[y:y + h, x:x + w] img = cv2.rectangle(img, (x,y),(x+w,y+h),(255,0,0), 2) # ---Các tham số để vẽ một hình chữ nhật # cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # img là biến image, nó có thể là " frame" như trong ví dụ này # x1,y1 -------------- # | | # | | # | | # -------------------- x+w,y+h # (255,0,0) là màu (R,G,B) # Số 2 cuối cùng trong bộ tham số là độ dày từ 1 đến 3 của đường viền eyes = eye_cascade.detectMultiScale(roi_gray) for (ex,ey,ew,eh) in eyes: cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2) resized = cv2.resize(img, (int(img.shape[1]/2),int(img.shape[0]/2))) #Hiển thị hình ảnh cv2.imshow("image",resized) cv2.waitKey(1) cv2.destroyAllWindows() |
+ Tiếp theo dùng lệnh : Python3 face.py để chạy file.+ Sau đó chúng ta dùng tổ hợp phím Ctrl + X để thoát, chọn Y và Enter để lưu file.
Chúng ta sẽ thu được hình ảnh như sau :
Mình sẽ giải thích ngắn gọn về đoạn code :
+ Đầu tiên chúng ta sử dụng hàm cv2.imread() để đọc ảnh.
+ Tiếp theo đó chúng ta chuyển ảnh của chúng ta sang màu xám.
+ Sau đó sử dụng mô hình nhận diện (face_cascade và eye_cascade) để tìm khuôn mặt khả dĩ nhất trong hình ảnh của chúng ta.
+ Mình có đặt lại kích thước ảnh khi hiển thị bằng cách sử dụng hàm cv2.resize()
2. Nhận diện khuôn mặt với hình ảnh trực tiếp từ camera
Giờ chúng ta lắp camera với Raspberry Pi và thử nhận diện khuôn mặt. Về cơ bản thì nguyên lý cũng gần giống như ví dụ trên.
from picamera.array import PiRGBArray |
+ Đầu tiên chúng ta sẽ khởi tạo PiCamera và PiRGBArray object với kích thước frame là 320×240, framrate = 24.
camera = PiCamera()
camera.resolution = (320, 240)
camera.framerate = 24
rawCapture = PiRGBArray(camera, size=(320, 240))
+ Tiếp theo chúng ta truy cập vào video stream với method capture_continuous(). Method này trả về một infinite iterator của các frame nhận được từ RPi Camera.
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True) :
+ Tiếp đến chúng ta chuyển frame thành dạng array và chuyển đổi nó sang dạng grayscale.
image = frame.array
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
+ Từ tệp mô hình đã tải lên chúng ta sẽ tìm kiếm khuôn mặt.
faces = face_cascade.detectMultiScale(gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (100, 100), flags = cv2.CASCADE_SCALE_IMAGE)
+ Chúng ta sẽ vẽ một hình chữ nhật xung quanh khuôn mặt mà chúng ta tìm được bằng vòng lặp :
for (x,y,w,h) in faces:
roi_gray = gray[y:y + h, x:x + w]
cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)
+ Giờ thì chúng ta sẽ hiển thị các frame :
cv2.imshow("Frame", image)
+ Việc ngắt chương trình có thể thực hiện bằng việc nhấn phím "q" hoặc tổ hợp phím Ctrl + C
+ Cuối cùng chúng ta bắt buộc phải xóa frame đang được hiển thị trước khi nhận frame tiếp theo.
rawCapture.truncate(0)
Ta sẽ thu được kết quả như hình :
Các bạn hãy thử các ví dụ vừa rồi và xem kết quả như thế nào nhé !!!
Ở bài viết tiếp theo mình sẽ hướng dẫn các bạn cách nhận dạng các khuôn mặt với OpenCV
Nếu các bạn có bất kỳ ý tưởng mới nào đừng ngần ngại mà hãy inbox trực tiếp cho fanpage . Xin chào và hẹn gặp lại các bạn trong các bài viết tiếp theo !!!
PIVIETNAM.COM.VN CHÚC CÁC BẠN THÀNH CÔNG !!!
Thực hiện bài viết : Đào Văn Hậu
Để cập nhật các tin tức công nghệ mới các bạn làm theo hướng dẫn sau đây :
Các bạn vào Trang chủ >> Tin tức. ở mục này có các bài viết kỹ thuật thuộc các lĩnh vực khác nhau các bạn có thể lựa chọn lĩnh vực mà mình quan tâm để đọc nhé !!!
Các bạn cũng có thế kéo xuống cuối trang để xem những tin tức công nghệ mới nhất.