Camera Raspberry Pi - Khi nào nó sẵn sàng cho khung hình tiếp theo


8

Khi sử dụng apis như C ++ hoặc raspicam api, bạn thăm dò máy ảnh bằng phương thức lấy () hoặc tương tự. Khi một khung đã sẵn sàng, phương thức trả về. Có cách nào để kiểm tra xem máy ảnh đã sẵn sàng mà không lấy khung chưa?

Đây có thể là một công cụ dòng lệnh, một cuộc gọi C ++, một thư viện python, theo nghĩa đen là bất kỳ phương thức nào.

Tôi yêu cầu bởi vì tôi có 4 quả mâm xôi với 4 máy ảnh và muốn quay từng khung hình với từng khung hình vào cùng một thời điểm. Các máy ảnh không đủ nhanh để ứng dụng của tôi thực hiện theo bất kỳ cách nào khác.

Câu trả lời:


2

Tôi nghĩ rằng tốt nhất là trả lời câu hỏi này bằng cách cung cấp một số cái nhìn sâu sắc về cách mọi thứ hoạt động thấp hơn một chút. Trước tiên, hãy cẩn thận: Tôi không phải là một chuyên gia phần mềm bởi bất kỳ sự tưởng tượng nào; sự hiểu biết khá sơ sài của tôi về cách thức hoạt động của mô-đun camera Pi dựa trên kinh nghiệm viết thư viện picamera của tôi và tương tác với các nhà phát triển phần mềm hiểu biết hơn nhiều trên các diễn đàn Pi. Nếu bạn nghe thông tin mâu thuẫn từ các nhà phát triển phần sụn, họ là người có thẩm quyền về vấn đề này, không phải tôi! Với cách đó ...

Ngay khi mô-đun máy ảnh của Pi được khởi tạo, nó đang chụp các khung hình. Những khung hình này (liên quan đến người dùng cuối) bị đổ nhưng bên trong phần sụn của máy ảnh còn nhiều thứ khác đang diễn ra. Các khung được đo để xác định mức tăng áp dụng cho cảm biến (AGC), cân bằng trắng để cung cấp cho thuật toán hiệu chỉnh AWB, v.v. Ví dụ: nếu bạn khởi động máy ảnh và bắt đầu ghi ngay lập tức bạn sẽ thấy cân bằng trắng chính nó trong một vài khung hình đầu tiên của bản ghi:

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    camera.start_recording('video1.h264')
    time.sleep(5)
    camera.stop_recording()

Tuy nhiên, nếu bạn đặt độ trễ trước khi bắt đầu ghi, bạn sẽ thấy cân bằng trắng ổn định vào thời điểm ghi bắt đầu:

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    time.sleep(5)
    camera.start_recording('video2.h264')
    time.sleep(5)
    camera.stop_recording()

Vì vậy, cho rằng máy ảnh luôn chụp được khung hình ngay cả khi chúng ta không chụp ảnh hoặc quay video, điều gì thực sự xảy ra khi chúng ta chọn chụp ảnh? Chúng tôi bảo phần sụn kích hoạt tính năng chụp và phần sụn chờ khung hình tiếp theo hoàn thành trước khi chuyển lại cho chúng tôi (thực tế, nếu bạn chụp ảnh từ cổng tĩnh thay vì cổng video, có nhiều hơn thế bao gồm chuyển đổi chế độ, nhưng bạn quan tâm đến cổng video vì vậy hãy bỏ qua điều đó).

Xem xét điều này có nghĩa là gì để đồng bộ hóa (trường hợp sử dụng cụ thể của bạn). Máy ảnh không "sẵn sàng" để chụp khung hình tại bất kỳ điểm cụ thể nào. Nó đã chụp một khung hình và khi bạn yêu cầu một khung hình, nó sẽ trao cho bạn khung hoàn chỉnh tiếp theo sẽ có sẵn. Để đồng bộ hóa khung hình của máy ảnh, tất cả các máy ảnh sẽ phải được khởi tạo cùng một lúc, và sau đó đồng hồ bên trong của chúng sẽ phải chạy chính xác (máy ảnh có đồng hồ bên trong riêng; chúng không dựa vào Đồng hồ của Pi).

Đáng buồn thay, tôi không nghĩ rằng đây thực sự là một triển vọng thực tế. Nếu tôi nhớ lại một cách chính xác, mô đun tính toán Pi (có 2 cổng camera trên bo mạch và hỗ trợ đồng thời 2 mô đun camera) sử dụng một số cuộc gọi đặc biệt trong phần sụn để có được 2 mô đun sử dụng tín hiệu đồng hồ duy nhất (tôi không biết làm thế nào hoạt động ở cấp độ phần cứng nhưng tôi giả sử nó sử dụng một cái gì đó cụ thể cho mô đun tính toán); Tôi không thể tưởng tượng làm thế nào bạn làm điều gì đó tương tự trên 4 Pis.

Cập nhật:

Tôi nên thêm rằng có thể thực hiện đồng bộ hóa thô với một số kiến ​​thức mạng hợp lý (ví dụ: các gói phát sóng UDP). Nói cách khác, có thể lấy tất cả các Pi trên mạng để kích hoạt chụp trong vòng một phần nghìn giây của nhau (giả sử mạng có độ trễ thấp tốt như Ethernet), nhưng như được mô tả ở trên vẫn không đảm bảo rằng tất cả các camera sẽ thực sự chụp một khung hình cùng một lúc; sẽ có độ trễ tối đa của khung hình (cộng với độ trễ mạng) giữa thời gian bắt đầu của kết quả chụp.

Nếu mức độ đồng bộ hóa đó là đủ cho mọi người, họ có thể muốn kiểm tra dự án hợp chất là một dự án khác mà tôi đã viết trên đầu trang của picamera cho mục đích này.


Bạn có thể nói về "đồng bộ khung" nhiều camera ở chế độ tĩnh (không phải video). Tôi đoán cảm biến có thể lại chạy ở chế độ "chạy miễn phí" ngay cả đối với ảnh tĩnh, chỉ với độ phân giải đầy đủ và FPS thấp hơn (có thể là 15 FPS? Sẽ cho độ trễ khung hình dài hơn video 30 FPS). Bạn có thể xác nhận giả định này? Tôi quan tâm đến giải pháp C ++ vì Python chỉ thêm một mức độ không chắc chắn về thời gian trên đó ...
Kozuch

Trong những năm qua, tôi đã học được nhiều hơn một chút và có lẽ nên cập nhật câu trả lời này vào một lúc nào đó. Đối với người mới bắt đầu, khẳng định rằng có đồng bộ hóa trên máy ảnh kép của mô-đun tính toán là sai: không có, chúng chỉ bắt đầu đồng bộ và cuối cùng (trong vài giờ) sẽ trôi đi. Trên ảnh tĩnh, máy ảnh sẽ truyền phát khung cho đến khi chụp nhưng sau đó chuyển chế độ sang chế độ cảm biến 2 hoặc 3 (phụ thuộc khung hình) trong khi chụp.
Dave Jones

Tôi đã viết một phiên bản mở rộng của chương phần cứng máy ảnh cho phiên bản picamera tiếp theo dựa trên phản hồi từ các nhà phát triển phần sụn máy ảnh - có thể đáng để đọc qua (mặc dù nó vẫn chưa hoàn thành) vì nó bao gồm một số chi tiết này.
Dave Jones

Tài liệu của bạn khá là đọc rộng rãi nhưng tôi không có tài nguyên để tìm hiểu sâu về chúng bây giờ - tôi chỉ đọc nhanh. Tôi thấy có cả chế độ video và tĩnh (cổng tĩnh). Chúng tôi biết về cổng video (cảm biến chạy miễn phí) nhưng bạn có thể giải thích cổng vẫn còn ý nghĩa và cách thức hoạt động không? Nó có thể được sử dụng bằng cách nào đó để kích hoạt chính xác hơn (độ trễ màn trập) mà cổng video có thể không? Tôi đã hỏi raspicam C ++ dev cho cùng một chủ đề nhưng chưa có câu trả lời.
Kozuch

Không: cổng tĩnh chỉ là một tạo phẩm MMAL khiến cho một đường dẫn hình ảnh khác trên GPU tạo ra đầu ra tĩnh "tốt hơn". Do đó, khi sử dụng cổng tĩnh để chụp, chế độ cảm biến tạm thời được chuyển đổi, sử dụng thuật toán khử nhiễu mạnh hơn, v.v. Nó sẽ không cung cấp cho bạn bất kỳ sự khác biệt nào về độ trễ màn trập (công tắc chế độ có thể sẽ làm phức tạp nó nếu có bất cứ điều gì).
Dave Jones
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.