Anda harus menjalankan proses kamera setiap saat.
Ini adalah satu-satunya cara saya dapat mencapai hasil (rata-rata) 50 ms. Saya mencari solusi di mana-mana. 1 detik terlalu lambat untuk proyek sensor gerak saya.
Proyek @Dave Jones membantu saya mengetahui cara melakukannya.
Hanya 2 file:
sebuah daemon, berjalan sepanjang waktu dan klien.
Dasmon adalah tempat Anda mengatur semua pengaturan kamera.
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
(di terminal kedua) 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)
Saya memposting jawaban ini karena saya menemukan ini di Google, mencoba menemukan jawaban sendiri. Saya tidak dapat menemukannya, jadi saya harus menggali beberapa proyek dan membuat sendiri sesuatu.
Anda harus menentukan batas waktu 0.
Dari bantuan raspistill
Untuk menguji berapa lama perintah untuk dieksekusi, Anda dapat menggunakan "waktu"
sumber
-t
opsi. Karena @Cerin menyatakan ini, entah bagaimana, merusak gambar jika disetel terlalu rendah. Sejujurnya, dokumentasi Raspberry Pi memiliki informasi yang terlalu sedikit tentang opsi ini dan mengarah pada asumsi yang salah bahwa batas waktu adalah "penundaan" / "pemicu waktu" yang jelas tidak.Saya telah menentukan alias berikut di .bash_profile saya untuk memungkinkan pemotretan kamera yang mudah dan cepat:
Setiap kali saya mengetik
shot
pada baris perintah, gambar dengan cap waktu disimpan, misalnyashot-2016-02-27_0934.jpg
.sumber
--timeout 1
(?) Argumen saya akan terkejut jika itu yang cepat - tapi karena saya tidak (belum) mendapat sistem saya untuk keadaan seperti itu bahwa dibutuhkan snap-shot dari yang pernah mencoba untuk membuka front saya pintu saya tidak bisa memilih! 8-) Penggunaan baris perintah dengan baik (dengan asumsi jam telah disetel) - termasuk menempatkan stempel datetime dengan nilai paling signifikan terlebih dahulu sehingga urutan-alfa-numerik sama dengan urutan-urutan tanggal!Anda mungkin ingin melihat proyek compoundpi (pengungkapan penuh: Saya penulisnya). Ini dimaksudkan untuk memicu tangkapan dari banyak Pi dengan modul kamera dan menggunakan paket siaran UDP untuk membuat semuanya memicu sedekat mungkin. Daemon berjalan pada setiap Pi yang mengaktifkan kamera dan memicu pengambilan setelah menerima paket UDP yang berisi perintah CAPTURE (perintah lain tersedia untuk mengonfigurasi kamera; protokolnya didokumentasikan dengan cukup baik ). Pengaturan menggunakan Ethernet sangat ideal, tetapi wifi juga akan berfungsi, meskipun Anda mungkin harus menggunakan fungsionalitas penundaan waktu untuk mendapatkan sinkronisasi yang layak dalam kasus itu (karena hilangnya paket / latensi variabel).
Saya tidak bisa mengatakan itu telah diuji dengan 100 Pi - saat ini pengaturan terbesar menggunakan 20 Pi, tapi saya akan tertarik untuk mendengar masalah yang melibatkan skala yang lebih besar.
Proyek ini mencakup klien baris perintah , klien GUI (ditulis dalam Qt sehingga harus bekerja pada Linux / Mac / Windows tetapi ini baru diuji pada Ubuntu pada saat ini, dan itu masih tidak berdokumen), dan perpustakaan klien berbasis Python untuk menulis pekerjaan batch.
sumber