raspistill -o /home/pi/test55.jpg -ex sports --nopreview
我在镜头前启动了一个iPhone天文钟。结果? 7秒09(但很锐利,所以快门速度等还不错,我并没有变得模糊不清)。我该怎么做才能在拍摄照片之前“不”花X秒钟?我将同步数百个RPI,并且我不希望其中的一些人在4秒时拍摄图片,而另一些人在10秒时拍摄其他图片,所以我想了解那里发生的一切。 >
#1 楼
您需要使摄像头进程一直运行。这是我可以达到(平均)50ms结果的唯一方法。我到处寻找解决方案。 1秒钟对于我的运动传感器项目来说太慢了。 >
始终运行的守护程序和一个客户端。
守护程序是您设置所有相机设置的地方。
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中找到了此答案,试图自己找到答案。我找不到一个,所以我不得不深入研究一些项目,然后自己想出一些办法。
#2 楼
您需要将超时指定为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,因为没有延迟图像
–罗南·蒂博道
2014年10月6日13:16
在我的Raspberry中,将超时指定为0似乎意味着“无限”,而将超时指定为“ 1”似乎可以解决问题。
– MondKin
2015年4月13日在23:25
同样,使用如此低的超时时间也不会给相机足够的时间来暴露收集器,从而导致图像变暗。我发现在图像开始变得暗淡和模糊之前,我不能低于300左右。
–塞林
2015年10月17日在21:57
如果不是非常必要,则不要使用-t选项。如@Cerin所述,如果设置得太低,这会以某种方式破坏图像。老实说,Raspberry Pi的文档中关于此选项的信息太少,导致错误的假设,认为超时是简单的“延迟” /“时间触发”,而显然不是。
– Flatron
16年5月21日在15:15
#3 楼
我在.bash_profile中指定了以下别名,以方便快速地进行相机拍摄:已保存,例如shot
。评论
欢迎来到Raspberry Pi Stack Exchange社区!即使使用--timeout 1参数(?),如果速度如此之快,我也会感到惊讶-但由于我(尚未)使系统达到这样的状态,因此需要对谁尝试执行的操作进行快照解锁我的前门,我实在无法挑剔! 8-)尽管很好地使用了命令行(假设已经设置了时钟)-包括首先将具有最高有效值的日期时间戳记放在首位,以便字母数字排序顺序与日期排序顺序相同!
– SlySven
16-2-27在19:54
〜$次射击真实0m0.040s用户0m0.010s sys 0m0.020s q。 e。 d。 ;)
– NDB
16-2-28在19:32
不幸的是,0.040秒实在难以实现。上面的time命令的用法有缺陷,它实际上只会测量分配SHOTTIME变量所花费的时间,而不能捕获图像。实际时间约为1秒。
– Slackhacker
16年8月20日在13:52
谢谢您的评论,您是对的。我从原始文本中删除了花费的时间。
– NDB
16年8月24日在20:02
#4 楼
您可能想看一下compoundpi项目(完整披露:我是作者)。它旨在通过相机模块触发大量Pi的捕获,并使用UDP广播数据包使它们之间的触发尽可能地接近。每个Pi上都会运行一个守护进程,该守护进程将启动摄像机并在收到包含CAPTURE命令的UDP数据包时触发捕获(其他命令可用于配置摄像机;该协议已被详细记录)。使用以太网进行设置是理想的选择,但是wifi也可以使用,尽管在这种情况下(由于数据包丢失/可变的延迟),您可能必须使用延时功能来实现良好的同步。我不能说它已经过100 Pi的测试-目前使用它的最大设置涉及20,但是我想听听涉及更大规模的任何问题。命令行客户端,GUI客户端(使用Qt编写,因此应该可以在Linux / Mac / Windows上运行,但目前仅在Ubuntu上进行了测试,并且尚未记录),以及用于编写批处理作业的基于Python的客户端库。
评论
我不太担心udp部分或客户端(我不想手动控制它们,它们由一个更大的项目控制),但是compoundpi是否使用需要立即捕获的东西,或者它也有像raspistill这样的延迟?
–罗南·蒂博道
2014年10月6日13:17
Dave,看来您是围绕我需要的项目的作者,我们是否有可能进行Skype或电子邮件讨论?
–罗南·蒂博道
2014年10月6日13:18
当然-您可以直接向我发送电子邮件(我的电子邮件地址应该在我的GitHub个人资料上可见)
–戴夫·琼斯(Dave Jones)
2014年10月6日13:21
哦,还有另一个问题:马上就要到了。当compoundpi守护程序启动时,它将初始化并配置摄像机(这是raspistill大量延迟的来源),然后等待捕获命令。 capture命令可以立即引起捕获,也可以等到指定的时间戳记再捕获。在这种情况下,接收命令和捕获之间的延迟应为毫秒。
–戴夫·琼斯(Dave Jones)
2014年10月6日13:27
戴夫·琼斯(Dave Jones),在拍摄之前初始化摄像机的想法,您能提供更多信息吗?我们可以从命令行执行此操作吗?
–奥利
2015年3月27日在6:44
评论
当遇到相同的问题时,我想出了相同的解决方案,但是还没有写出任何代码。很高兴看到有人击败了我!
–尼克·库恩斯
19年4月6日,0:42