Raspistill chậm để kích hoạt?


18

Tôi đang cố gắng kích hoạt "nhiều" quả mâm xôi cùng nhau, trong khi sử dụng raspistill chỉ để thử nghiệm, tôi tự hỏi tại sao chụp ảnh lại chậm như vậy, tôi đã thực hiện một thử nghiệm và đồng thời khi tôi nhấn enter lệnh này:

raspistill -o /home/pi/test55.jpg -ex sports --nopreview

Tôi khởi động đồng hồ bấm giờ iPhone trước camera. Kết quả? 7 giây, 09 (nhưng sắc nét, vì vậy tốc độ màn trập v.v ... vẫn ổn, tôi không bị mờ số). Tôi có thể làm gì để nó "không" mất X giây trước khi chụp ảnh? Tôi sẽ đồng bộ hàng trăm RPI và tôi không muốn một số người trong số họ chụp ảnh ở 4 và một số khác sau 10 giây để tôi hiểu những gì đang xảy ra ở đó.

Câu trả lời:


4

Bạn cần phải có quá trình máy ảnh chạy mọi lúc.

Đây là cách duy nhất tôi có thể đạt được kết quả (trung bình) 50ms. Tôi tìm mọi nơi để tìm giải pháp. 1 giây là quá chậm cho dự án cảm biến chuyển động của tôi.

Dự án của @Dave Jones đã giúp tôi tìm ra cách để làm điều đó.

Chỉ cần 2 tệp:

một daemon, chạy mọi lúc và một khách hàng.

Trình nền là nơi bạn đặt tất cả các cài đặt camera.

picam-daemon

picam-client.py

trăn picam-daemon.py

import threading
import os, io, base64, time, socket, picamera, daemon
import daemon.runner

MAX_LENGTH = 50 # max length of any possible entry from "client"
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # setup socket
PORT = 10000 # port 10000
HOST = '127.0.0.1' # runs on local host
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # this allows us to override port, prevents error
serversocket.bind((HOST, PORT)) # lock server to this port and host
serversocket.listen(10) # max 10 clients


# Waits for commands, such as "snap" and "ack"
# Runs over "sockets"
def handle(clientsocket):
    while 1:
        buf = clientsocket.recv(MAX_LENGTH)

        # Receive the SNAP command. Take a picture with PiCam.
        if buf == 'snap':
            start = time.time()
            camera.capture('/home/pi/ir/picam-latest-snap.jpg')
            finish = start - time.time()
            print finish
            print 'Picture Taken!'

        if buf == 'ack':
            print 'Ping: Hello!'

        if len(buf) == 0: break

# Camera is always loaded here
# The "magic" is in the camThread, this allows a picture to be captured, then it gracefully closed the camera connection and reopens it. This produces very fast captures (54ms vs 1.5s!)
while 1:
    # setup camera
    camera = picamera.PiCamera()
    camera.resolution = (640, 480)
    #camera.zoom = (0.2, 0.2, 1.0, 1.0)
    camera.exposure_mode = 'sports'
    print('Camera server running')

    # accept connections from outside, in order to receive commands
    (clientsocket, address) = serversocket.accept()
    ct = threading.Thread(target=handle, args=(clientsocket,))
    ct.run() # this can be run(), because it can be scaled.

    print 'Camera thread starting.'
    camThread = threading.Thread()
    while camThread.is_alive():
        camThread.join(1)
    camThread.run() # this must be start(), otherwise PiCam will crash. This is because PiCam cannot receive more than 1 connection.
    print 'Camera thread ended'
    camera.close() # Gracefully close PiCam if client disconnects

(trong một thiết bị đầu cuối thứ hai) python picam-client.py

import socket
import sys


HOST = '127.0.0.1'
PORT = 10000
s = socket.socket()
s.connect((HOST, PORT))

print s

while 1:
    msg = raw_input("Command To Send: ")
    if msg == "close":
       s.close()
       sys.exit(0)
    s.send(msg)

Tôi đang đăng câu trả lời này vì tôi đã tìm thấy câu trả lời này trên Google, cố gắng tự tìm câu trả lời. Tôi không thể tìm thấy một cái, vì vậy tôi phải tìm hiểu một số dự án và tự mình nghĩ ra thứ gì đó.


Khi gặp phải cùng một vấn đề, tôi đã đưa ra một giải pháp tương tự, nhưng chưa đi đến đâu để viết mã. Vui mừng khi thấy người khác đánh bại tôi!
Nick Coons

6

Bạn cần chỉ định thời gian chờ là 0.

Từ sự giúp đỡ của mâm xôi

-timeout "Time (in ms) before takes picture and shuts down (if not specified, set to 5s)

Để kiểm tra một lệnh mất bao lâu để thực thi, bạn có thể sử dụng "thời gian"

time raspistill -o /home/pi/test55.jpg -ex sports --nopreview --timeout 0

Điều này loại bỏ thời gian chờ mặc định là 5 giây nhưng vấn đề là tôi đang nhận được nhiều hơn thế, từ những gì tôi hiểu trên diễn đàn, không có cách nào thực sự sử dụng raspistill như là không có hình ảnh chậm trễ
Ronan Thibaudau

8
Trong Raspberry của tôi, việc chỉ định thời gian chờ là 0 dường như có nghĩa là "vô hạn", trong khi chỉ định thời gian chờ là "1" dường như là một mẹo nhỏ
MondKin

4
Ngoài ra, sử dụng thời gian chờ thấp như vậy sẽ không cho máy ảnh đủ thời gian để phơi sáng bộ sưu tập, dẫn đến hình ảnh bị tối. Tôi thấy tôi không thể xuống thấp hơn khoảng 300 trước khi hình ảnh bắt đầu tối và mờ.
Cerin

2
Nếu không nghiêm trọng cần thiết để lại các -ttùy chọn ra. Vì @Cerin tuyên bố điều này bằng cách nào đó sẽ phá hủy hình ảnh nếu được đặt quá thấp. Thành thật mà nói, tài liệu của Raspberry Pi có quá ít thông tin về tùy chọn này và dẫn đến giả định sai lầm rằng thời gian chờ là "kích hoạt thời gian" / "kích hoạt thời gian" đơn giản mà rõ ràng là không có.
Flatron

4

Tôi đã chỉ định các bí danh sau trong .bash_profile của mình để cho phép chụp ảnh nhanh và dễ dàng:

alias shot='SHOTTIME=$(date +"%Y-%m-%d_%H%M") && raspistill -o shot-$SHOTTIME.jpg --nopreview --exposure sports --timeout 1

Bất cứ khi nào tôi gõ shotvào dòng lệnh, ví dụ, một hình ảnh có dấu thời gian sẽ được lưu shot-2016-02-27_0934.jpg.


1
Chào mừng đến với cộng đồng Raspberry Pi Stack Exchange! Ngay cả với --timeout 1(?) Lập luận tôi sẽ ngạc nhiên nếu nó nhanh chóng - nhưng như tôi đã không (chưa) có hệ thống của tôi đến một nhà nước như vậy mà nó mất một snap-shot ai bao giờ cố gắng để mở khóa front- của tôi cánh cửa tôi thực sự không thể chọn! 8-) Mặc dù sử dụng tốt dòng lệnh (giả sử đồng hồ đã được đặt) - bao gồm đặt dấu thời gian với các giá trị quan trọng nhất trước tiên để thứ tự sắp xếp theo số alpha giống như thứ tự sắp xếp ngày!
SlySven

1
~ $ time shot thực 0m0.040s người dùng 0m0.010s sys 0m0.020s qed;)
NDB

1
Thật không may là 0,040 giây rất nhanh để trở thành sự thật .. Việc sử dụng lệnh thời gian ở trên là thiếu sót, nó thực sự sẽ chỉ đo thời gian thực hiện để gán biến SHOTTIME, không chụp ảnh. Thời gian thực là ~ 1 giây .
slackhacker

Cảm ơn bạn đã bình luận của bạn, bạn đã đúng. Tôi đã loại bỏ thời gian cần thiết từ văn bản gốc của tôi.
NDB

2

Bạn có thể muốn xem dự án hợp chất (tiết lộ đầy đủ: Tôi là tác giả). Nó nhằm mục đích kích hoạt các ảnh chụp từ nhiều Pi với các mô-đun máy ảnh và sử dụng các gói phát sóng UDP để khiến tất cả chúng kích hoạt càng gần nhau càng tốt. Một daemon chạy trên mỗi Pi mà cháy lên chụp camera và trigger khi nhận được một gói tin UDP chứa lệnh CAPTURE (lệnh khác có sẵn để cấu hình các máy ảnh; giao thức được khá tốt tài liệu ). Thiết lập sử dụng Ethernet là lý tưởng, nhưng wifi cũng sẽ hoạt động, mặc dù bạn có thể phải sử dụng chức năng trì hoãn thời gian để có được đồng bộ hóa tốt trong trường hợp đó (do mất gói / độ trễ biến đổi).

Tôi không thể nói rằng nó đã được thử nghiệm với 100 Pi - tại thời điểm thiết lập lớn nhất sử dụng nó liên quan đến 20, nhưng tôi rất muốn nghe về bất kỳ vấn đề nào liên quan đến quy mô lớn hơn.

Dự án bao gồm một máy khách dòng lệnh , một máy khách GUI (được viết bằng Qt để nó hoạt động trên Linux / Mac / Windows nhưng nó chỉ được thử nghiệm trên Ubuntu vào thời điểm này và nó vẫn không có giấy tờ) và thư viện máy khách dựa trên Python cho viết công việc hàng loạt.


Tôi không lo lắng lắm về phần udp cũng như ứng dụng khách (tôi không muốn điều khiển chúng bằng tay, chúng được điều khiển bởi một dự án lớn hơn nhiều) nhưng liệu hợp chất có sử dụng thứ gì đó gần chụp ngay lập tức hay nó cũng có một sự chậm trễ như raspistill?
Ronan Thibaudau

Dave, có vẻ như bạn là tác giả của các dự án xoay quanh những gì tôi cần, liệu có khả năng chúng ta có thể có một cuộc thảo luận qua Skype hoặc email không?
Ronan Thibaudau

Chắc chắn - đừng ngại gửi email trực tiếp cho tôi (địa chỉ email của tôi sẽ hiển thị trên hồ sơ GitHub của tôi )
Dave Jones

1
Ồ, và về câu hỏi khác của bạn: nó gần như ngay lập tức. Khi daemon ghéppi được khởi động, nó sẽ khởi chạy và định cấu hình máy ảnh (đó là nơi có rất nhiều độ trễ trong raspistill đến) sau đó chờ lệnh chụp. Lệnh chụp có thể ngay lập tức gây ra việc chụp hoặc đợi cho đến khi dấu thời gian được chỉ định trước khi chụp. Trong trường hợp tức thì, độ trễ giữa nhận lệnh và chụp sẽ là mili giây.
Dave Jones

Dave Jones, ý tưởng khởi tạo máy ảnh này trước khi chụp, bạn có thể cung cấp thêm thông tin không? Chúng ta có thể làm điều này từ dòng lệnh?
Ollie
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.