Вам нужно, чтобы процесс камеры работал постоянно.
Это единственный способ получить результаты (в среднем) 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, пытаясь найти ответ сам. Я не мог найти один, поэтому мне пришлось покопаться в некоторых проектах и придумать что-нибудь самому.
Вам нужно указать время ожидания 0.
От распилти помогите
Чтобы проверить, сколько времени занимает выполнение команды, вы можете использовать «время»
источник
-t
опцию. Как утверждает @Cerin, это каким-то образом разрушает изображение, если оно установлено слишком низким. Честно говоря, документация Raspberry Pi содержит слишком мало информации об этой опции и приводит к ложному предположению, что тайм-аут является простой «задержкой» / «временным триггером», а это явно не так.Я указал следующий псевдоним в моем файле .bash_profile, чтобы можно было легко и быстро делать снимки с камеры:
shot
Например, всякий раз, когда я печатаю в командной строке, изображение с отметкой времени сохраняетсяshot-2016-02-27_0934.jpg
.источник
--timeout 1
(?) Аргументом я был бы удивлен , если это было , что быстро - но так как у меня (пока) не получил мою систему до такого состояния , что она занимает моментальный снимок , который когда - либо пытается разблокировать фронт- дверь, которую я не могу по-настоящему оторвать! 8-) Хорошее использование командной строки, хотя (при условии, что часы были установлены) - включая установку метки даты и времени с наиболее значимыми значениями первыми, чтобы алфавитно-цифровой порядок сортировки был таким же, как порядок сортировки даты!Возможно, вы захотите взглянуть на проект составного (полное раскрытие: я автор). Он предназначен для запуска захвата от многочисленных пи с модулями камеры и использует широковещательные пакеты UDP, чтобы все они запускались как можно ближе друг к другу. Демон запускается на каждом Пи, который запускает камеру и запускает захват при получении UDP-пакета, содержащего команду CAPTURE (другие команды доступны для настройки камеры; протокол довольно хорошо задокументирован ). Настройка с использованием Ethernet идеальна, но Wi-Fi также будет работать, хотя вам, возможно, придется использовать функцию временной задержки, чтобы получить приличную синхронизацию в этом случае (из-за потери пакетов / переменной задержки).
Я не могу сказать, что он был протестирован с 100 Pi - на данный момент самая большая установка использует 20, но мне было бы интересно услышать о любых проблемах, связанных с большими масштабами.
Проект включает в себя клиент командной строки, клиент с графическим интерфейсом (написанный на Qt, поэтому он должен работать на Linux / Mac / Windows, но на данный момент он был протестирован только на Ubuntu, и все еще не документирован), и клиентская библиотека на основе Python для написание пакетных заданий.
источник