我在具有Logitech网络摄像头的Raspberry Pi 3上运行的kivy中具有以下相机代码:

class KivyCamera(Image):

    def __init__(self, **kwargs):
        super(KivyCamera, self).__init__(**kwargs)
        self.capture = None

    def start(self, capture, fps=30):
        self.capture = capture
        Clock.schedule_interval(self.update, 1.0 / fps)

    def stop(self):
        Clock.unschedule_interval(self.update)
        self.capture = None

    def update(self, dt):
        ret, frame = self.capture.read()
        if ret:
            # convert it to texture
            cv2.putText(frame, "Testing!", (0, 50), cv2.FONT_HERSHEY_COMPLEX, 2, (100, 0, 255))
            buf1 = cv2.flip(frame, 0)

            if (recON == 1):
                out.write(frame)
            #
            buf = buf1.tostring()
            image_texture = Texture.create(
                #size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
                size=(frame.shape[1], frame.shape[0]), colorfmt='rgb')
            image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
            #self.canvas.ask_update()
            self.texture = image_texture


在从Logitech C920(在LCD上)显示帧大约3分钟后,我得到以下memory exception。如果我使用Logitech C170,它将运行约5分钟以上:

python - Kivy相机内存错误-LMLPHP
在我看来,缓冲区似乎溢出了。具有更高分辨率的C920可以更快地填充它,但是我无法在代码中看到缓冲区正在填充什么?

最佳答案

运行代码时,我注意到此警告:

python - Kivy相机内存错误-LMLPHP

当我从以下位置更改python行时:

image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')


至:

image_texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte')


我不再收到warning或内存泄漏。我使用cvtColoropencv功能换回了色彩空间

09-15 14:57