通过PiCamera模块捕获Raspicam图像 - 如何避免旧图像?

时间:2017-06-13 11:17:54

标签: python numpy camera iterator raspberry-pi

我正在开发一个项目,我们使用附加到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_continuousgenerator类型的对象,我的假设是它会在后台生成相机图像,这些图像在程序等待时以及在{{ 1}}返回队列中的下一个元素。

无论如何,我只对相机拍摄的最新,最新图像感兴趣。 首次尝试获取最新图像的尝试失败了。我尝试在while循环中反复调用self.capture_continuous.next()以获取最新图像。 由于生成器显然也是迭代器,我尝试了本文中提到的一些方法:Cleanest way to get last item from Python iterator

简单地使用self.capture_continuous.next()类本身的capture()函数不是一个选项,因为它需要大约。拍摄图像0.3秒,这对我们的用例来说太多了。

有没有人知道可能导致上述延迟的原因以及如何避免这种延迟?

0 个答案:

没有答案