我正在开发一个项目,我们使用附加到Raspberry Pi的Raspicam使用PiCamera模块使用python捕获(和处理)图像。
使用我们当前的实现,我遇到了意外的行为。 相机配置为以每秒15帧的速度捕获图像。为了模拟处理时间,程序等待5秒钟。
最小例子:
#!/usr/bin/env python
import cv2
from picamera import PiCamera
from picamera.array import PiRGBArray
class RaspiCamera:
def __init__(self, width, height, framerate):
self.camera = PiCamera()
self.camera.resolution = (width, height)
self.camera.framerate = framerate
self.rawCapture = PiRGBArray(self.camera, size=self.camera.resolution)
self.capture_continuous = self.camera.capture_continuous(self.rawCapture, format="bgr", use_video_port=True)
def capture(self):
frame = self.capture_continuous.next()
image = self.rawCapture.array
self.rawCapture.truncate(0)
return image
if __name__ == "__main__":
camera = RaspiCamera(640, 480, 15)
while True:
frame = camera.capture()
cv2.imshow("Image", frame)
if cv2.waitKey(5000) & 0xFF == ord('q'):
break
首次调用capture()
时,self.capture_continuous.next()
会返回最新图像。连续调用capture()
时,经常会发生self.capture_continuous.next()
未返回最新图像但已经过几秒钟的图像(通过将相机指向时钟进行验证)。它有时甚至超过10秒。另一方面,有时self.capture_continuous.next()
实际上会返回最新的图像。
由于capture_continuous
是generator
类型的对象,我的假设是它会在后台生成相机图像,这些图像在程序等待时以及在{{ 1}}返回队列中的下一个元素。
无论如何,我只对相机拍摄的最新,最新图像感兴趣。
首次尝试获取最新图像的尝试失败了。我尝试在while循环中反复调用self.capture_continuous.next()
以获取最新图像。
由于生成器显然也是迭代器,我尝试了本文中提到的一些方法:Cleanest way to get last item from Python iterator。
简单地使用self.capture_continuous.next()
类本身的capture()
函数不是一个选项,因为它需要大约。拍摄图像0.3秒,这对我们的用例来说太多了。
有没有人知道可能导致上述延迟的原因以及如何避免这种延迟?