Распистил медленно, чтобы сработать?


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.

От распилти помогите

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

Чтобы проверить, сколько времени занимает выполнение команды, вы можете использовать «время»

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

Это удаляет тайм-аут по умолчанию, равный 5 секундам, но проблема в том, что я получаю больше, из того, что я понимаю на форуме, нет реального способа использовать raspistill, как получить изображения без задержки
— Ronan Thibaudau

8
В моей Raspberry указание тайм-аута 0, по-видимому, означает «бесконечный», а указание тайм-аута «1», кажется,
— помогает

4
Кроме того, использование такого малого времени ожидания не дает камере достаточно времени, чтобы выставить коллекторы, что приводит к затемнению изображения. Я обнаружил, что не могу опускаться ниже 300, пока изображение не станет темным и размытым.
— Cerin

2
Если в этом нет особой необходимости, оставьте эту -tопцию. Как утверждает @Cerin, это каким-то образом разрушает изображение, если оно установлено слишком низким. Честно говоря, документация Raspberry Pi содержит слишком мало информации об этой опции и приводит к ложному предположению, что тайм-аут является простой «задержкой» / «временным триггером», а это явно не так.
— Флатрон

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 реальный 0m0.040s пользователь 0m0.010s sys 0m0.020s qed;)
— NDB

1
К сожалению, 0,040 секунды - это слишком далеко, чтобы быть правдой. Использование приведенной выше команды time является ошибочным, оно фактически измеряет только время, необходимое для назначения переменной SHOTTIME, а не для захвата изображения. Реальное время ~ 1 секунда .
— Slackhacker

Спасибо за ваш комментарий, вы правы. Я удалил время, которое требуется из моего оригинального текста.
— ОПРС

2

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

Я не могу сказать, что он был протестирован с 100 Pi - на данный момент самая большая установка использует 20, но мне было бы интересно услышать о любых проблемах, связанных с большими масштабами.

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


Я не очень беспокоюсь ни о части udp, ни о клиенте (я не хочу контролировать их вручную, они контролируются гораздо более крупным проектом), но составная часть использует что-то, что требует почти мгновенного захвата, или же оно имеет задержка как распистил?
— Ронан Тибо,

Дэйв, кажется, ты автор проектов, которые вращаются вокруг того, что мне нужно, есть ли шанс, что мы могли бы поговорить по скайпу или по электронной почте?
— Ронан Тибо,

Конечно - не стесняйтесь, напишите мне напрямую (мой адрес электронной почты должен быть виден в моем профиле GitHub )
— Дейв Джонс

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

Дэйв Джонс, эта идея инициализации камеры перед съемкой, вы можете дать больше информации? Можем ли мы сделать это из командной строки?
— Олли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.