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


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.