Raspistill ทำงานช้าเพื่อกระตุ้น?


18

ฉันพยายามเรียก raspberries "จำนวนมาก" ด้วยกันในขณะที่ใช้ raspistill เป็นเพียงการทดสอบฉันสงสัยว่าทำไมการถ่ายภาพช้ามากฉันทำการทดสอบและในเวลาเดียวกันกับที่ฉันกดปุ่มคำสั่งนี้:

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

ฉันเริ่มเที่ยงตรง iPhone ที่ด้านหน้าของกล้อง ผลลัพธ์? 7 วินาที, 09 (แต่คมชัด, ดังนั้นความเร็วชัตเตอร์และอื่น ๆ ก็ดีฉันไม่ได้รับหมายเลขเบลอ) ฉันจะทำอะไรเพื่อ "ไม่" ใช้เวลา X วินาทีก่อนที่จะถ่ายภาพ? ฉันจะซิงค์ RPI หลายร้อยตัวและฉันไม่ต้องการให้พวกเขาถ่ายภาพที่ 4 และที่อื่น ๆ ในเวลา 10 วินาทีดังนั้นฉันต้องการที่จะเข้าใจสิ่งที่เกิดขึ้นที่นั่น

คำตอบ:


5

คุณต้องให้กระบวนการกล้องทำงานตลอดเวลา

นี่เป็นวิธีเดียวที่ฉันสามารถบรรลุผลลัพธ์ของ (โดยเฉลี่ย) 50ms ฉันดูไปทุกที่เพื่อหาทางออก 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 พยายามหาคำตอบด้วยตัวเอง ฉันหาไม่เจอดังนั้นฉันต้องขุดหาโปรเจ็กต์บางอย่างแล้วคิดด้วยตัวเอง


เมื่อพบปัญหาเดียวกันฉันพบวิธีแก้ไขปัญหาเดียวกัน แต่ยังไม่ได้ใกล้ที่จะเขียนโค้ดเลย ดีใจที่เห็นว่ามีคนอื่นเอาชนะฉันไปได้!
Nick Coons

6

คุณต้องระบุการหมดเวลาเป็น 0

จากความช่วยเหลือของ raspistill

-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" ดูเหมือนว่าจะทำเคล็ดลับ
MondKin

4
นอกจากนี้การใช้การหมดเวลาที่ต่ำเช่นนี้ไม่ได้ให้เวลากับกล้องมากพอที่จะเปิดเผยนักสะสมทำให้ภาพมืดลง ฉันพบว่าฉันไม่สามารถไปต่ำกว่าประมาณ 300 ก่อนที่ภาพจะเริ่มมืดและพร่ามัว
Cerin

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 แม้จะมีการ--timeout 1โต้เถียง (?) ฉันก็ต้องแปลกใจถ้ามันเป็นเรื่องที่รวดเร็ว - แต่ในขณะที่ฉันยังไม่ได้ (ยัง) ทำให้ระบบของฉันอยู่ในสถานะที่ใช้การถ่ายภาพอย่างรวดเร็วของผู้ที่พยายามปลดล็อคด้านหน้าของฉัน - ประตูฉันไม่สามารถเลือกได้จริงๆ! 8-) ใช้บรรทัดคำสั่งได้ดี (สมมติว่ามีการตั้งค่านาฬิกา) - รวมถึงการใส่ตราประทับวันที่ด้วยค่าที่สำคัญที่สุดก่อนดังนั้นลำดับการเรียงตัวอักษรและตัวเลขจะเหมือนกับการเรียงลำดับวันที่!
SlySven

1
~ $ time shot ผู้ใช้ 0m0.040s จริง 0m0.010s sys 0m0.020s qed;)
NDB

1
โชคไม่ดีที่จะเป็นจริงเร็ว0.040วินาทีการใช้คำสั่ง time ด้านบนนั้นมีข้อบกพร่องจริง ๆ แล้วมันจะวัดเวลาที่ใช้เพื่อกำหนดตัวแปร SHOTTIME เท่านั้นไม่ใช่การจับภาพ เวลาที่แท้จริงคือ~ 1 วินาที
slackhacker

ขอบคุณสำหรับความคิดเห็นของคุณคุณพูดถูก ฉันได้ลบเวลาที่ใช้ออกจากข้อความต้นฉบับของฉัน
NDB

2

คุณอาจต้องการดูโครงการ compoundpi (การเปิดเผยอย่างเต็มรูปแบบ: ฉันเป็นผู้แต่ง) มันมีไว้สำหรับทริกเกอร์การจับภาพจาก Pi หลายตัวด้วยโมดูลกล้องและใช้แพ็คเก็ตออกอากาศ UDP เพื่อให้พวกมันทั้งหมดถูกกระตุ้นให้ใกล้เคียงที่สุดเท่าที่จะทำได้ daemon ทำงานบน Pi แต่ละตัวซึ่งจะเปิดกล้องและทริกเกอร์การจับเมื่อได้รับแพ็กเก็ต UDP ที่มีคำสั่ง CAPTURE (คำสั่งอื่น ๆ ที่มีอยู่ในการกำหนดค่ากล้อง; โปรโตคอลนั้นมีเอกสารที่ดีพอสมควร) การตั้งค่าโดยใช้อีเธอร์เน็ตนั้นเหมาะ แต่ WiFi ก็ใช้งานได้เช่นกันแม้ว่าคุณอาจจะต้องใช้ฟังก์ชั่นการหน่วงเวลาเพื่อรับการซิงโครไนซ์ที่เหมาะสมในกรณีนั้น

ฉันไม่สามารถบอกได้ว่ามันได้รับการทดสอบกับ 100 Pi - ในขณะนี้การตั้งค่าที่ใหญ่ที่สุดที่ใช้มันเกี่ยวข้องกับ 20 แต่ฉันสนใจที่จะได้ยินปัญหาใด ๆ ที่เกี่ยวข้องกับเครื่องชั่งขนาดใหญ่

โครงการประกอบด้วยไคลเอนต์บรรทัดคำสั่งไคลเอนต์ GUI (เขียนเป็น Qt ดังนั้นควรทำงานบน Linux / Mac / Windows แต่ได้รับการทดสอบบน Ubuntu ณ จุดนี้เท่านั้นและยังไม่มีเอกสาร) และไลบรารีไคลเอ็นต์ที่ใช้ Pythonสำหรับ การเขียนงานแบ็ตช์


ฉันไม่กังวลเกี่ยวกับส่วน udp หรือลูกค้า (ฉันไม่ต้องการควบคุมด้วยมือพวกเขาถูกควบคุมโดยโครงการขนาดใหญ่กว่ามาก) แต่ compoundpi ใช้สิ่งที่ใกล้เข้ามาทันทีหรือมี ความล่าช้าเช่น raspistill?
Ronan Thibaudau

เดฟดูเหมือนว่าคุณเป็นผู้เขียนโครงการที่หมุนรอบสิ่งที่ฉันต้องการมีโอกาสที่เราจะได้พูดคุยกับ Skype หรืออีเมลหรือไม่?
Ronan Thibaudau

แน่นอน - อย่าลังเลที่จะส่งอีเมลถึงฉันโดยตรง (ที่อยู่อีเมลของฉันควรปรากฏในโปรไฟล์ GitHubของฉัน)
เดฟโจนส์

1
โอ้และคำถามอื่น ๆ ของคุณ: ใกล้เข้ามาแล้ว เมื่อเริ่มต้น compoundpi daemon มันเริ่มต้นและกำหนดค่ากล้อง (ซึ่งเป็นที่ที่มีความล่าช้ามากใน raspistill มาจาก) จากนั้นรอคำสั่งจับภาพ คำสั่งการจับภาพสามารถทำให้เกิดการจับภาพทันทีหรือรอจนกว่าการประทับเวลาที่ระบุก่อนที่จะจับ ในกรณีทันทีความล่าช้าระหว่างการรับคำสั่งและการจับภาพควรเป็นมิลลิวินาที
เดฟโจนส์

Dave Jones ความคิดในการเริ่มต้นกล้องก่อนที่จะถ่ายคุณสามารถให้ข้อมูลเพิ่มเติมได้หรือไม่ เราสามารถทำสิ่งนี้ได้จาก commandline หรือไม่?
Ollie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.