Raspistill повільно спрацьовувати?


18

Я намагаюся запустити "багато" малини разом, тоді як використання raspistill призначений лише для тестування, мені цікаво, чому фотографування так повільно, я зробив тест і, одночасно, коли я натиснув на цю команду:

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

Я запускаю хронометр iPhone перед камерою. Результат? 7 секунд, 09 (але різкі, тому швидкість затвора і т. Д. Була нормальна, я не отримував розмитого числа). Що я можу зробити для того, щоб "не" пройшло X секунд перед фотографуванням? Я збираюсь синхронізувати сотні RPI, і я не хочу, щоб деякі з них сфотографували о 4, а інші за 10 секунд, тому я хотів би зрозуміти, що там відбувається.

Відповіді:


5

Потрібно, щоб процес камери працював весь час.

Це єдиний спосіб, коли я міг отримати результати (в середньому) 50 мс. Я всюди шукав рішення. 1 секунда була занадто повільною для мого проекту датчика руху.

Проект @Dave Jones допоміг мені зрозуміти, як це зробити.

Всього 2 файли:

демон, весь час працює і клієнт.

Демон - це місце, де ви встановлюєте всі налаштування камери.

picam-daemon.py

picam-client.py

python 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

(у другому терміналі) 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)

Я публікую цю відповідь, оскільки знайшов це в Google, намагаючись знайти відповідь сам. Я не зміг його знайти, тому мені довелося розкопати деякі проекти і сам щось придумати.


Зіткнувшись з тією ж проблемою, я придумав те саме рішення, але ще не дійшов до написання коду. Радий бачити, що хтось інший побив мене до цього!
Нік Кунс

6

Потрібно вказати час очікування 0.

З довідки raspistill

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

Щоб перевірити, скільки часу займає команда на виконання, ви можете використовувати "time"

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

Це знімає час очікування за замовчуванням 5 секунд, але проблема в тому, що я отримую більше, ніж те, що я розумію на форумі, немає реального способу використання raspistill, як отримати зображення без затримки
Ronan Thibaudau

8
У моєму Raspberry вказівка ​​тайм-ауту 0, схоже, означає "нескінченний", а час очікування "1", здається, робить трюк
MondKin

4
Крім того, використання такого невеликого тайм-ауту не дає камері достатньо часу для викриття колекторів, що призводить до затемнення зображення. Я вважаю, що не можу опуститися нижче 300, перш ніж зображення почне темніти і розмиватися.
Серін

2
Якщо це не дуже важливо, залиште -tваріант. Як стверджує @Cerin, це якимось чином знищує зображення, якщо встановлено занадто низько. Якщо чесно, у документації Raspberry Pi є занадто мало інформації про цю опцію і призводить до помилкового припущення, що час очікування є простим "затримкою" / "тригером часу", якого, очевидно, немає.
Flatron

4

У моєму .bash_profile я вказав наступний псевдонім, щоб забезпечити легкі та швидкі зйомки камери:

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

Щоразу, коли я друкую shotв командному рядку, наприклад, зберігається зображення з позначкою часу shot-2016-02-27_0934.jpg.


1
Ласкаво просимо до спільноти Raspberry Pi Stack Exchange! Навіть з --timeout 1(?) Аргументом я був би здивований , якщо це було , що швидко - але так як у мене (поки) не отримав мою систему до такого стану , що вона займає моментальний знімок , який коли - або намагається розблокувати фронт двері, я не можу насправді вибирати гнид! 8-) Хоча добре використовувати командний рядок (якщо припустити, що встановлено годинник) - включаючи введення спочатку штампів часу та найзначніших значень, щоб алфавітно-числовий порядок сортування був таким самим, як порядок сортування дат!
SlySven

1
~ $ time shot real 0m0.040s user 0m0.010s sys 0m0.020s qed;)
NDB

1
На жаль, 0,040 секунд, на жаль, далеко не швидко істинно. Використання вищезазначеної команди часу є помилковою, вона фактично вимірює лише час, необхідний для призначення змінної SHOTTIME, не фіксуючи зображення. Реальний час становить ~ 1 секунда .
хуліган

Дякую за ваш коментар, ви праві. Я зняв час, який потрібно для мого оригінального тексту.
НДБ

2

Можливо, ви захочете ознайомитись із проектом компаніпі (повне розкриття: я автор). Він призначений для запускання знімків з численних Pi з модулями камери та використовує широкомовні пакети UDP, щоб змусити їх усі запускатись якомога ближче один до одного. Демон працює на кожному Pi, який запускає камеру і запускає захоплення після отримання пакету UDP, що містить команду CAPTURE (для налаштування камери доступні інші команди; протокол досить добре зафіксований ). Налаштування за допомогою Ethernet є ідеальним, але Wi-Fi також буде працювати, хоча вам, можливо, доведеться використовувати функцію затримки часу, щоб отримати гідну синхронізацію в цьому випадку (через втрату пакету / змінну затримку).

Я не можу сказати, що його перевірено на 100 Pi - на даний момент найбільша установка, що використовує його, включає 20, але мені було б цікаво почути будь-які проблеми, пов’язані з масштабними масштабами.

Проект включає клієнт командного рядка, клієнтський графічний інтерфейс (написаний на Qt, тому він повинен працювати на Linux / Mac / Windows, але він перевірений лише на Ubuntu на даний момент, і він поки що недокументований) та бібліотеку клієнтів на основі Python для написання пакетних завдань.


Я не дуже переживаю за частку udp, ні про клієнта (я не хочу керувати ними вручну, вони контролюються набагато більшим проектом), але чи не використовується компілятор щось, що займає миттєве захоплення, або він також має затримка, як raspistill?
Ронан Тібаудау

Дейв, здається, ти автор проектів, які обертаються навколо того, що мені потрібно, чи є шанс, щоб ми могли обговорити скайпом чи електронною поштою?
Ронан Тібаудау

Звичайно - не соромтеся надіслати мені електронну пошту (моя адреса електронної пошти повинна бути помітна в моєму профілі GitHub )
Дейв Джонс

1
О, і щодо вашого іншого питання: це майже момент. Коли запускається демон-компілятор, він ініціалізує і налаштовує камеру (звідки походить велика затримка raspistill), після чого очікує команду захоплення. Команда захоплення може або миттєво викликати захоплення, або зачекати, поки не буде зазначена часова мітка перед захопленням. У даному випадку затримка між отриманням команди та захопленням повинна становити мілісекунди.
Дейв Джонс

Дейв Джонс, ідею ініціалізації камери перед тим, як зробити знімок, ви можете дати більше інформації? Чи можемо ми це зробити з командного рядка?
Оллі,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.