9.0 KiB
Chụp ảnh - Raspberry Pi
Trong phần này của bài học, bạn sẽ thêm cảm biến camera vào Raspberry Pi và đọc hình ảnh từ nó.
Phần cứng
Raspberry Pi cần một camera.
Camera bạn sẽ sử dụng là Raspberry Pi Camera Module. Camera này được thiết kế để hoạt động với Raspberry Pi và kết nối thông qua một cổng chuyên dụng trên Pi.
💁 Camera này sử dụng Camera Serial Interface, một giao thức từ Mobile Industry Processor Interface Alliance, được gọi là MIPI-CSI. Đây là một giao thức chuyên dụng để truyền hình ảnh.
Kết nối camera
Camera có thể được kết nối với Raspberry Pi bằng cáp ruy băng.
Nhiệm vụ - kết nối camera
-
Tắt nguồn Pi.
-
Kết nối cáp ruy băng đi kèm với camera vào camera. Để làm điều này, nhẹ nhàng kéo phần kẹp nhựa đen trong giá đỡ ra một chút, sau đó trượt cáp vào khe cắm, với mặt màu xanh hướng ra xa ống kính, các dải chân kim loại hướng về phía ống kính. Khi cáp đã được cắm hoàn toàn, đẩy phần kẹp nhựa đen trở lại vị trí ban đầu.
Bạn có thể tìm thấy một hình ảnh động minh họa cách mở kẹp và chèn cáp trong tài liệu Raspberry Pi Getting Started with the Camera module.
-
Tháo Grove Base Hat khỏi Pi.
-
Luồn cáp ruy băng qua khe camera trong Grove Base Hat. Đảm bảo mặt màu xanh của cáp hướng về phía các cổng analog được gắn nhãn A0, A1, v.v.
-
Chèn cáp ruy băng vào cổng camera trên Pi. Một lần nữa, kéo phần kẹp nhựa đen lên, chèn cáp, sau đó đẩy kẹp trở lại. Mặt màu xanh của cáp nên hướng về phía các cổng USB và ethernet.
-
Lắp lại Grove Base Hat.
Lập trình camera
Raspberry Pi giờ đây có thể được lập trình để sử dụng camera bằng thư viện Python PiCamera.
Nhiệm vụ - bật chế độ camera cũ
Đáng tiếc, với phiên bản Raspberry Pi OS Bullseye, phần mềm camera đi kèm với hệ điều hành đã thay đổi, khiến PiCamera không hoạt động theo mặc định. Hiện đang có một phiên bản thay thế, gọi là PiCamera2, nhưng nó chưa sẵn sàng để sử dụng.
Hiện tại, bạn có thể đặt Pi vào chế độ camera cũ để cho phép PiCamera hoạt động. Cổng camera cũng bị vô hiệu hóa theo mặc định, nhưng việc bật phần mềm camera cũ sẽ tự động kích hoạt cổng này.
-
Bật nguồn Pi và chờ nó khởi động.
-
Mở VS Code, trực tiếp trên Pi hoặc kết nối thông qua tiện ích Remote SSH.
-
Chạy các lệnh sau từ terminal:
sudo raspi-config nonint do_legacy 0 sudo reboot
Lệnh này sẽ bật một cài đặt để kích hoạt phần mềm camera cũ, sau đó khởi động lại Pi để cài đặt này có hiệu lực.
-
Chờ Pi khởi động lại, sau đó mở lại VS Code.
Nhiệm vụ - lập trình camera
Lập trình thiết bị.
-
Từ terminal, tạo một thư mục mới trong thư mục home của người dùng
pi
có tênfruit-quality-detector
. Tạo một tệp trong thư mục này có tênapp.py
. -
Mở thư mục này trong VS Code.
-
Để tương tác với camera, bạn có thể sử dụng thư viện Python PiCamera. Cài đặt gói Pip cho thư viện này bằng lệnh sau:
pip3 install picamera
-
Thêm đoạn mã sau vào tệp
app.py
của bạn:import io import time from picamera import PiCamera
Đoạn mã này nhập một số thư viện cần thiết, bao gồm thư viện
PiCamera
. -
Thêm đoạn mã sau bên dưới để khởi tạo camera:
camera = PiCamera() camera.resolution = (640, 480) camera.rotation = 0 time.sleep(2)
Đoạn mã này tạo một đối tượng PiCamera, đặt độ phân giải thành 640x480. Mặc dù các độ phân giải cao hơn được hỗ trợ (lên đến 3280x2464), bộ phân loại hình ảnh hoạt động trên các hình ảnh nhỏ hơn nhiều (227x227) nên không cần chụp và gửi hình ảnh lớn hơn.
Dòng
camera.rotation = 0
đặt góc xoay của hình ảnh. Cáp ruy băng đi vào từ phía dưới của camera, nhưng nếu camera của bạn được xoay để dễ dàng hướng vào vật thể bạn muốn phân loại, bạn có thể thay đổi dòng này thành số độ xoay.Ví dụ, nếu bạn treo cáp ruy băng qua một vật thể để nó nằm ở phía trên của camera, hãy đặt góc xoay thành 180:
camera.rotation = 180
Camera cần vài giây để khởi động, do đó dòng
time.sleep(2)
được sử dụng. -
Thêm đoạn mã sau bên dưới để chụp hình ảnh dưới dạng dữ liệu nhị phân:
image = io.BytesIO() camera.capture(image, 'jpeg') image.seek(0)
Đoạn mã này tạo một đối tượng
BytesIO
để lưu trữ dữ liệu nhị phân. Hình ảnh được đọc từ camera dưới dạng tệp JPEG và lưu trữ trong đối tượng này. Đối tượng này có một chỉ báo vị trí để biết nó đang ở đâu trong dữ liệu để có thể ghi thêm dữ liệu vào cuối nếu cần, vì vậy dòngimage.seek(0)
di chuyển vị trí này trở lại đầu để tất cả dữ liệu có thể được đọc sau. -
Bên dưới đoạn mã này, thêm đoạn sau để lưu hình ảnh vào tệp:
with open('image.jpg', 'wb') as image_file: image_file.write(image.read())
Đoạn mã này mở một tệp có tên
image.jpg
để ghi, sau đó đọc tất cả dữ liệu từ đối tượngBytesIO
và ghi vào tệp.💁 Bạn có thể chụp hình ảnh trực tiếp vào tệp thay vì đối tượng
BytesIO
bằng cách truyền tên tệp vào lệnhcamera.capture
. Lý do sử dụng đối tượngBytesIO
là để sau này trong bài học bạn có thể gửi hình ảnh đến bộ phân loại hình ảnh của mình. -
Hướng camera vào một vật thể và chạy đoạn mã này.
-
Một hình ảnh sẽ được chụp và lưu dưới dạng
image.jpg
trong thư mục hiện tại. Bạn sẽ thấy tệp này trong trình khám phá của VS Code. Chọn tệp để xem hình ảnh. Nếu cần xoay, cập nhật dòngcamera.rotation = 0
theo yêu cầu và chụp lại hình ảnh.
💁 Bạn có thể tìm thấy đoạn mã này trong thư mục code-camera/pi.
😀 Chương trình camera của bạn đã thành công!
Tuyên bố miễn trừ trách nhiệm:
Tài liệu này đã được dịch bằng dịch vụ dịch thuật AI Co-op Translator. Mặc dù chúng tôi cố gắng đảm bảo độ chính xác, xin lưu ý rằng các bản dịch tự động có thể chứa lỗi hoặc không chính xác. Tài liệu gốc bằng ngôn ngữ bản địa nên được coi là nguồn thông tin chính thức. Đối với các thông tin quan trọng, khuyến nghị sử dụng dịch vụ dịch thuật chuyên nghiệp bởi con người. Chúng tôi không chịu trách nhiệm cho bất kỳ sự hiểu lầm hoặc diễn giải sai nào phát sinh từ việc sử dụng bản dịch này.