Các kỹ thuật cơ bản với Camera cho Raspberry Pi (Phần 2)

Các kỹ thuật cơ bản với Camera cho Raspberry Pi (Phần 2)

17:08 - 25/02/2019

Các kỹ thuật cơ bản với Camera cho Raspberry Pi (Phần 2)

NVIDIA Jetson AGX Orin hiệu suất AI mạnh nhất của NVIDIA Jetson Family với 275 TOPS, 2048 NVIDIA® CUDA® cores, 64 Tensor Cores
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]

Các kỹ thuật cơ bản với Camera cho Raspberry Pi (Phần 2)

Xin chào các bạn. Sau một thời gian dài với bánh trưng ngày tết thì hôm nay mình đã trở lại để hướng dẫn cho các bạn một số tính năng của camera cho Raspberry Pi (Link here)

Ở phần một mình đã hướng dẫn các bạn một số tính năng như chụp hình và quay video mới một lệnh duy nhất trên Terninal. Như đã hứa hôm nay mình sẽ hướng dẫn các bạn sử dụng thư viện Picamera với ngôn ngữ Python với nhiều tính năng thú vị hơn nữa. Nào chúng ta cùng bắt đầu thôi !!!

1. Tính năng camera preview 

Sau khi các bạn đã kết nối camera với Raspberry Pi và enable cho camera, các bạn có thể bắt đầu với tính năng xem trước.

Chúng ta sẽ làm việc trên Terminal .

Tạo một file camera.py ở Desktop:

cd Desktop/

sudo nano camera.py

Lưu ý : Các bạn không được đặt tên file là picamera.py (Điều này sẽ gây ra lỗi vì tên trùng với tên module Python)

Các bạn nhập đoạn code sau vào file chúng ta vừa tạo ở trên:

from  picamera import PiCamera

from  time import sleep

camera = PiCamera()

camera.start_preview()

sleep(10)

camera.stop_preview()

Sau đó chúng ta dùng tổ hợp phím Ctrl + X để thoát, chọn YEnter để lưu file.

Tiếp theo dùng lệnh sau để chạy file :

python3 camera.py 

Chúng ta sẽ có một bản xem trước trên màn hình như sau :

 

Lưu ý bản xem trước của camera chỉ hoạt động khi màn hình được kết nối với Pi, vì vậy việc truy cập từ xa (như SSH và VNC) sẽ không cho phép bạn xem bản xem trước của camera.

Nếu bản xem trước của bạn bị ngược, bạn có thể xoay nó với đoạn code sau :

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.rotation = 180

camera.start_preview()

sleep(10)

camera.stop_preview()

Bạn có thể xoay hình ảnh theo 90,180 hoặc 270 độ, bạn cũng có thể đặt nó thành 0.

Để thay đổi độ trong suốt của bản xem trước của camera bạn có thể thực hiện bằng cách đặt mức độ alpha:

from picamera import PiCamera

from time import sleep 

camera = PiCamera() 

camera.start_preview(alpha=200)

sleep(10)

camera.stop_preview()

alpha nằm trong khoảng từ 0 đến 255.

2. Chụp ảnh tĩnh 

Việc sử dụng thông dụng nhất cho module camera là chụp ảnh tĩnh

Chúng ta chỉ việc hiệu chỉnh đoạn code trên bằng cách giảm sleep() và thêm lệnh camera.capture()

Các bạn dùng lệnh để mở file và sửa.

cd Desktop()

sudo nano camera.py

Ta có đoạn mã như sau :

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.start_preview()

sleep(5)

camera.capture('/home/pi/Desktop/image.jpg')

camera.stop_preview()

+ Điều quan trọng ở đây là thời gian sleep ít nhất là 2 giây trước khi chụp, để cho cảm biến có thời gian đặt mức độ sáng.

+ Chạy file python sau khi đã sửa đổi và bạn sẽ thấy bản xem trước của camera mở trong 5 giây trước khi chụp ảnh tĩnh. Bạn cũng thấy được phần xem trước điều chỉnh độ phân giải trong giây lát khi ảnh được chụp.

=>> Kết quả là ta sẽ được một ảnh ở trên Desktop. Các bạn nháy đúp vào tệp hình ảnh để mở và xem ảnh đã chụp được.

Bây giờ chúng ta sẽ thêm một vòng lặp để chụp 5 ảnh liên tiếp.

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.start_preview()

for i in range(5):

    sleep(5)

    camera.capture('/home/pi/Desktop/image%d.jpg' % i)

camera.stop_preview()

+ Ảnh sẽ được lưu dưới dạng image0.jpg, image1,…

+ Các bạn giữ nguyên vị trí của camera. Khi bức ảnh thứ 5 được chụp phần xem trước của camera sẽ đóng lại. 

+ Trên màn hình Desktop sẽ xuất hiện 5 ảnh mới mà chúng ta vừa chụp được.

3. Quay video 

Các bạn đã sử dụng máy ảnh rồi phải không ạ. Nào giờ chúng ta sẽ chuyển sang quay video.

Sửa đoạn code của chúng ta ở trên bằng cách thay thế capture() bằng start_recording() stop_recording(). Ở đây chúng ta sử dụng wait_recording() thay cho sleep(). Phương thức wait_recording() tương tự như sleep() ở chỗ nó sẽ tạm dừng số giây quy định, khác biệt ở đây là nó sẽ liên tục kiểm tra lỗi ( Ví dụ như việc tràn bộ nhớ ) trong thời gian nó đang đợi.

Chúng ta sửa đoan code thành như sau :

from picamera import PiCamera

camera = PiCamera()

camera.start_preview()

camera.start_recording('/home/pi/video.h264')

camera.wait_recording(10)

camera.stop_recording()

camera.stop_preview()

+ Chạy file camera.py của chúng ta. Camera sẽ ghi hình trong 10 giây và sau đó đóng phần xem trước.

+ Để phát video bạn có thể mở bằng VLC Player hoặc bạn có thể mở bằng cách gõ lệnh trên Terminal như sau :

omxplayer video.h264

Chúng ta cũng có thể quay 5 video liên tiếp cách nhau 5 giây bằng cách thêm một vòng lặp.

from picamera import PiCamera

camera = PiCamera()

camera.start_preview()

camera.start_recording('video1.h264')

camera.wait_recording(10)

for i range(5):

    camera.split_recording('/home/pi/video%d.h264'%i)

    camera.wait_recording(5)

camera.stop_recording()

camera.stop_preview()

+ Video thu được có dạng video0.h264, video1.h264,…

+ Trên Desktop sẽ xuất hiện 5 video mà chúng ta vừa quay.

4. Các hiệu ứng.

Nào giờ chúng ta sẽ cùng nhau trải nghiệm các hiệu ứng của phần mềm camera cung cấp. Một số hiệu ứng chỉ áp dụng cho xem trước, một số hiệu ứng áp dụng cho việc chụp ảnh và có cả những hiệu ứng áp dụng được cho cả hai.

Đầu tiên là độ phân giải. Theo như mặc định thì độ phân giải được đặt thành độ phân giải của màn hình của các bạn, độ phân giải tối đa là 2592x1944 cho ảnh tĩnh và 1920x1080 cho quay video. Chúng ta xem ví dụ sau để đặt độ phân giải thành tối đa.

Lưu ý: Chúng ta cần đặt số khung hình là 15 để bật độ phân giải tối đa này.

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.resolution = (2592, 1944)

camera.framerate = 15

camera.start_preview()

sleep(5)

camera.capture('/home/pi/Desktop/max.jpg')

camera.stop_preview()

Độ phân giải tối thiểu là 64x64. Các bạn hãy thử nhé.

Đôi khi bạn cần phân tích hoặc xử lý trên hình ảnh, bạn có thể muốn chụp ảnh nhỏ hơn độ phân giải hiện tại của máy ảnh. Chúng ta có thể làm như sau :

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.resolution = (1024, 768)

camera.preview()

sleep(5)

camera.capture('resize.jpg', resize(320, 240))

Ngoài ra các bạn có thể thêm chữ viết vào hình ảnh của mình với camera.annotate_text(). Các bạn cũng có thể thay đổi kích thước chữ bằng lệnh camera.annotate_text_size() với kích thước trong khoảng từ 6 đến 160, mặc định là 32. Cùng thử một ví dụ :

from  picamera import PiCamera

from  time import sleep

camera = PiCamera()

camera.start_preview()

camera.annotate_text = "Chao mung ban den voi pivietnam.com.vn"

camera.annotate_text_size = 50

sleep(5)

camera.capture('/home/pi/Desktop/text.jpg')

camera.stop_preview()

Với một chút khéo léo bạn có thể hiển thị các chuỗi dài hơn:

from picamera import PiCamera

from time import sleep

import itertools

s = "Chao mung cac ban den voi bai viet ky thuat tai pivietnam.com.vn ... "

camera = PiCamera()

camera.resolution = (640, 480)

camera.framerate = 24

camera.start_preview()

camera.annotate_text ='  ' * 32

for c in itertools.cycle(s):

    camera.annotate_text = camera.annotate_text[1:32] +c

    sleep(0.2)

camera.stop_preview()

Bạn cũng có thể thay đổi độ sáng trong khoảng 0 đến 100, mặc định là 50.

Ở đây chúng ta thử đặt độ sáng là 70 nhé.

from picamera import PiCamera

from time import sleep 

camera = PiCamera() 

camera.start_preview()

camera.brightness = 70

camera.annotate_text = "bright 70%"

sleep(5)

camera.capture('/home/pi/Desktop/bright.jpg')

camera.stop_preview()

Ta cùng thử dùng một vòng lặp để thay đổi độ sáng và chú thích trên màn hình mức sáng hiện tại.

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.start_preview()

for i in range(100):

    camera.annotate_text = "Brightness: %d" % i

    camera.brightness = i

    sleep(0.1)

camera.stop_preview()

Và tương tự chúng ta sẽ thử với độ tương phản và xem kết quả nhé !

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.start_preview()

for i in range(100):

    camera.annotate_text = "Contrast: %d" % i

    camera.contrast = i

    sleep(0.1)

camera.stop_preview()

Nếu muốn các bạn cũng có thể tùy chỉnh màu sắc cho chú thích bằng việc import color bằng việc điều chỉnh như sau :

from picamera import PiCamera, Color

Bạn hãy thử với đoạn code sau :

from picamera import PiCamera, Color

from time import sleep

camera = PiCamera()

camera.start_preview()

camera.annotate_background = Color('blue')

camera.annotate_foreground = Color('yellow')

camera.annotate_text = " Chao mung ban den voi pivietnam.com.vn "

sleep(5)

camera.stop_preview()

Nếu bạn muốn sử dụng một hiệu ứng hình ảnh cụ thể hãy sử dụng camera.image_effect với các tùy chọn như : none, negative, solarize, sketch, denoise, emboss, oilpaint, hatch, gpen, pastel, watercolor, film, blur, saturation, colorswap, washedout, posterise, colorpoint, colorbalance, cartoon, deinterlaceldeinterlacel2. Mặc định ở đây là none. Chúng ta sẽ thử một trong các hiệu ứng nêu trên nhé.

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.start_preview()

camera.image_effect = 'watercolor'

camera.annotate_text = 'watercolor'

sleep(5)

camera.capture('/home/pi/Desktop/watercolor.jpg')

camera.stop_preview()

Sử dụng vòng lặp để thử các hiệu ứng khác nhau với chế độ xem trước.

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.start_preview()

for effect in camera.IMAGE_EFFECTS:   

    camera.image_effect = effect   

    camera.annotate_text = "Effect: %s" % effect   

    sleep(5)

camera.stop_preview()

Tiếp theo, để đặt cân bằng trắng tự động thành chế độ đặt trước để áp dụng nhiều hiệu ứng bằng việc sử dụng camera.awb_mode với các tùy chọn như : off, auto, sunlight, cloudy, shade, tungsten, fluorescent, incandescent, flashhorizon. Mặc định là auto. Chúng ta hãy chọn một trong các tùy chọn trên để thử.

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.start_preview()

camera.awb_mode = 'cloudy'

sleep(5)

camera.capture('/home/pi/Desktop/cloudy.jpg')

camera.stop_preview()

Một cách để các bạn có thể lặp chế độ cân bằng trắng tự động có sẵn với camera.AWB_MODES

Bạn có thể sử dụng camera.exposure_mode để đặt mức phơi sáng ở chế độ đặt trước với các tùy chọn : off, auto, night, nightpreview, blacklight, spotlight, sports, snow, beach, verylong, fixedfps, antishake và fireworks. Mặc định ở đây là auto. Chọn một hiệu ứng mà bạn thích và thử nào.

from picamera import PiCamera

from time import sleep

camera = PiCamera()

camera.start_preview()

camera.exposure_mode = 'snow'

sleep(5)

camera.capture('/home/pi/Desktop/snow.jpg')

camera.stop_preview()

Các bạn cũng có thể lặp chế độ phơi sáng tự động có sẵn với camera.EXPOSURE_MODES.

Các bạn có thể tham khảo thêm về cách sử dụng thư viện PiCamera (tại đây)

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.