我有一个应用程序,我需要在另一个程序发出命令的非常具体的时刻拍照。由于相机需要非常轻,我从e-con系统购买了see3cam_CU135。我打算用python运行相机并让python等待来自其他程序的命令。触发和实际曝光之间的延迟是必不可少的知识,到目前为止,我还没有成功地发现它是什么。这是我的设置,以确定延迟:
我运行一个单独的脚本充当秒表,将我系统的时钟打印到我的屏幕上:
import time
while True:
print(time.time())
time.sleep(0.001)
然后我运行我的实际脚本来获取第一个脚本输出的图片。
import cv2
import time
vc = cv2.VideoCapture(1)
vc.set(cv2.CAP_PROP_FRAME_WIDTH,4208)
vc.set(cv2.CAP_PROP_FRAME_HEIGHT,3120)
vc.set(cv2.CAP_PROP_EXPOSURE,-2)
if vc.isOpened(): # try to get the first frame
t1=time.time()
while int(time.time()) == int(t1):
a=0
rval, frame = vc.read()
print(t1)
cv2.imwrite("photo.png", frame)
else:
rval = False
vc.release()
如果我在开始编写脚本时,让我们说1512638235.3549826,程序应该保持在while循环中,直到下一个完整的第二个开始,1512638236,然后触发图片,对吧?所以t1之后的时间减去整个秒后的时间应该给我延迟。
到目前为止一切都那么好,但这里有什么奇怪的:昨天我跑了,t1是1512579170.079795。所以脚本应该等待几乎一秒钟,然后触发图片。然而,秒表的图片显示1512579170.588795(触发命令发送前半秒)。是否有可能vc.read实际上没有触发一个帧,而只是读取当前在相机缓冲区中的任何帧,因此返回一个较旧的帧?如果是这样,我怎样才能在我需要的时候手动触发帧?
我在这里遇到的第二个问题是OpenCV的白平衡问题。显然,手动控制白平衡是不可能的(但是?)。只要它是可重复的,我就不在乎。如何保证自动白平衡关闭?我需要使用完全相同的设置拍摄所有照片,因为我需要能够比较不同光线条件下的绝对强度。我无法通过一些自动曝光或自动白平衡来更改设置。
哦,还有一条评论:我没有和python或openCV结婚,我可以完全不同地做到这一点。但是,最终将命令发送到我的脚本以拍摄照片的其他程序必须在Windows下运行。
我真的很感谢你的一些建议!