Raspistill이 느리게 트리거됩니까?


18

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
내 라즈베리에서 타임 아웃을 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 Stack Exchange 커뮤니티에 오신 것을 환영합니다! 심지어와 함께 --timeout 1(?)가 있다면 인수 내가 놀랄 것 빠른 -하지만 내가 가지고 있지 (아직)은 이제까지 내 전면의 잠금을 해제하려고 시도하는 사람들의 스냅 샷을 소요 한 상태에 내 시스템을 가지고 문 난 정말 집어 올릴 수 없어! 8-) 명령 줄을 잘 사용하지만 (시계가 설정되었다고 가정)-가장 중요한 값을 가진 날짜 시간 스탬프를 먼저 포함하여 영숫자 정렬 순서가 날짜 정렬 순서와 동일합니다!
SlySven

1
~ $ time shot real 0m0.040s 사용자 0m0.010s sys 0m0.020s qed;)
NDB

1
0.040 초는 안타깝게도 실제로는 빠르다. 위의 time 명령 사용법에 결함이 있으므로 실제로는 이미지를 캡처하지 않고 SHOTTIME 변수를 할당하는 데 걸리는 시간 만 측정합니다. 실시간은 ~ 1 초 입니다.
slackhacker

귀하의 의견에 감사드립니다. 원본 텍스트에서 걸리는 시간을 제거했습니다.
NDB

2

당신은 compoundpi 프로젝트를 보고 싶을 수도 있습니다 (전체 공개 : 저는 저자입니다). 카메라 모듈을 사용하여 수많은 Pi의 캡처를 트리거하기 위해 고안되었으며 UDP 브로드 캐스트 패킷을 사용하여 가능한 한 가깝게 모든 트리거링을 얻습니다. 각 Pi에서 데몬이 실행되어 카메라를 시작하고 CAPTURE 명령이 포함 된 UDP 패킷을 수신하면 캡처를 트리거합니다 (다른 명령을 사용하여 카메라를 구성 할 수 있으며 프로토콜은 상당히 잘 문서화 됨) ). 이더넷을 사용하는 설정이 이상적이지만, 패킷 지연 / 가변 대기 시간으로 인해 적절한 지연을 얻기 위해 시간 지연 기능을 사용해야 할 수도 있지만 wifi도 작동합니다.

100 Pi로 테스트했다고 말할 수는 없습니다. 현재 가장 큰 설정에는 20이 포함되지만 더 큰 스케일과 관련된 문제에 관심이 있습니다.

이 프로젝트에는 커맨드 라인 클라이언트 , GUI 클라이언트 (Qt로 작성되었으므로 Linux / Mac / Windows에서 작동해야하지만이 시점에서 우분투에서만 테스트되었으며 아직 문서화되어 있지 않음) 및 Python 기반 클라이언트 라이브러리가 포함 되어 있습니다. 배치 작업 작성.


나는 udp 부분이나 클라이언트에 대해 크게 걱정하지 않습니다 (수동으로 제어하고 싶지 않고 훨씬 더 큰 프로젝트로 제어됩니다) raspistill 같은 지연?
Ronan Thibaudau 2013 년

데이브, 당신이 내가 필요로하는 것을 중심으로하는 프로젝트의 저자 인 것 같습니다. Skype 나 이메일 토론을 할 수있는 기회가 있습니까?
Ronan Thibaudau

확실히-저에게 직접 이메일을 보내 주시기 바랍니다 (내 이메일 주소는 GitHub 프로필 에 표시되어야 합니다 )
Dave Jones

1
아, 그리고 당신의 다른 질문에 : 그것은 거의 즉각적입니다. compoundpi 데몬이 시작되면 카메라를 초기화하고 구성합니다 (여기서 raspistill의 지연이 많이 발생 함). 캡처 명령을 기다립니다. 캡처 명령은 즉시 캡처를 유발하거나 캡처하기 전에 지정된 타임 스탬프까지 기다릴 수 있습니다. 이 경우 명령 수신과 캡처 사이의 지연 시간은 밀리 초입니다.
Dave Jones

캡처하기 전에 카메라를 초기화한다는 아이디어 인 Dave Jones가 더 많은 정보를 제공 할 수 있습니까? 명령 줄에서이 작업을 수행 할 수 있습니까?
Ollie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.