Dự án Photobooth với Raspberry Pi

Dự án Photobooth với Raspberry Pi

 

Bạn có thể kết hợp các thư viện khác nhau với nhau để làm cho Python trở thành một công cụ mạnh mẽ để thực hiện một số dự án khá phức tạp. Với thư viện GPIO đã nói và SimpleCV, ta có thể tạo ra photobooth dựa trên Raspberry Pi (xem hình dưới). Và với chức năng findHaarFeatures trong SimpleCV, có thể tăng cường photobooth với một tính năng bổ sung đặc biệt: khả năng tự động chồng các dụng cụ ảo thú vị như mũ, mắt, râu và ria mép trên người trong photobooth. Code trong dự án này dựa trên dự án Mustacheinator trong Practical Computer Vision with SimpleCV của Kurt Demaagd, Anthony Oliver, Nathan Oostendorp và Katherine Scott (O’Reilly).

Output của Photobooth Raspberry Pi

 

Dưới đây là những gì cần để biến Raspberry Pi thành một photobooth:

  • Webcam USB hoặc Mô-đun Camera Raspberry Pi
  • Một màn hình
  • Một nút bấm
  • Dây nối
  • 1 điện trở 10K Ω

Trước khi bắt đầu, hãy đảm bảo rằng cả thư viện Python RPi.GPIO và SimpleCV đều được cài đặt và hoạt động đúng trên Raspberry Pi.

  1. Kết nối chân 24 với nút bấm. Một bên của nút phải được nối với 3.3V, nút kia đến chân 24. Đừng quên dùng điện trở 10K nối giữa đất và một bên của công tắc nối với chân 24.
  2. Tìm hoặc tạo một hình ảnh nhỏ của một bộ ria mép màu đen trên nền trắng và lưu nó là mustache.png trong một thư mục mới trên Raspberry Pi.
  3. Trong thư mục đó, tạo một file mới có tên là photobooth.py, nhập vào code được liệt kê trong Ví dụ 9-6 và lưu file.

 

Ví dụ 9-6. Mã nguồn cho photobooth.py

from time import sleep, time

from SimpleCV import Camera, Image, Display

import RPi.GPIO as GPIO

 

myCamera = Camera(prop_set={‘width’:320, ‘height’: 240})

myDisplay = Display(resolution=(320, 240))

stache = Image(“mustache.png”)

stacheMask = stache.createBinaryMask(color1=(0,0,0), color2=(254,254,254))  (1)

stacheMask = stacheMask.invert()  (2)

 

GPIO.setmode(GPIO.BCM)

GPIO.setup(24, GPIO.IN)

 

def mustachify(frame):  (3)

faces = frame.findHaarFeatures(‘face.xml’)

if faces:

for face in faces:

print “Face at: ” + str(face.coordinates())

myFace = face.crop()  (4)

noses = myFace.findHaarFeatures(‘nose.xml’)

if noses:

nose = noses.sortArea()[-1]  (5)

print “Nose at: ” + str(nose.coordinates())

xmust = face.points[0][0] + nose.x – (stache.width/2) (6)

ymust = face.points[0][1] + nose.y + (stache.height/3) (7)

else:

return frame  (8)

frame = frame.blit(stache, pos=(xmust, ymust), mask=stacheMask) (9)

return frame  (10)

else:

return frame  ⓫

 

while not myDisplay.isDone():

inputValue = GPIO.input(24)

frame = myCamera.getImage()

if inputValue == True:

frame = mustachify(frame)  ⓬

frame.save(“mustache-” + str(time()) + “.jpg”)  ⓭

frame = frame.flipHorizontal()  ⓮

frame.show()

sleep(3)  ⓯

else:

frame = frame.flipHorizontal() ⓰

frame.save(myDisplay)

sleep(.05)

(1)         Tạo một mặt nạ của bộ ria mép, chọn tất cả thay màu đen thành trong suốt (hai tham số, color1 và color2, là phạm vi màu sắc như các giá trị RGB từ 0 đến 255).

(2)         Đảo ngược mặt nạ sao cho chỉ các pixel đen trong ảnh được hiển thị và tất cả các pixel khác đều trong suốt.

(3)         Tạo ra một hàm có trong một khung hình và kết quả đầu ra với một bộ ria mép chồng lên nếu nó có thể tìm thấy khuôn mặt và mũi.

(4)         Tạo một subimage của khuôn mặt để tìm kiếm mũi nhanh hơn.

(5)         Nếu có nhiều loại mũi trên khuôn mặt, hãy chọn loại lớn nhất.

(6)         Đặt tọa độ x của bộ ria mép.

(7)         Đặt tọa độ y của bộ ria mép.

(8)         Nếu không tìm thấy mũi, chỉ cần trả lại khung mặt.

(9)         Sử dụng chức năng blit (viết tắt của BLock Image Transfer) để chồng lên bộ ria mép trên khung.

(10)        Quay trở lại khung “mustachified”.

⓫            Nếu không tìm thấy khuôn mặt nào, chỉ cần trả lại khung.

⓬            Chuyển khung vào hàm mustachify.

⓭            Lưu khung dưới dạng JPEG với thời gian hiện tại trong tên file.

⓮            Trước khi hiển thị hình ảnh, lật hình ảnh theo chiều ngang sao cho nó là hình ảnh phản chiếu của chủ thể.

⓯            Giữ hình ảnh được lưu trên màn hình trong ba giây.

⓰            Nếu nút không được ấn, chỉ cần lật hình ảnh trực tiếp và hiển thị nó.

Giờ ta thử kiểm tra. Hãy chắc rằng đã nối camera với Pi. Tiếp theo, vào terminal và chuyển đến thư mục chứa hình ria mép và photobooth.py, sau đó chạy script:

sudo photobooth.py

Đầu ra của máy ảnh sẽ xuất hiện trên màn hình. Khi nhấn nút, nó sẽ nhận diện bất kỳ khuôn mặt nào, thêm bộ ria mép và lưu hình ảnh. (Tất cả các hình ảnh sẽ được lưu trong cùng thư mục với script.)

 

Để có kiến thức đầy đủ và hệ thống về Raspberry Pi, bạn nên mua sách “GETTING STARTED WITH RASPBERRY PI“.

Mua ngay tại link: https://cachdung.com/getting-started-with-raspberry-pi.html

Giỏ Hàng
  • No products in the cart.