Python kivy应用程序速度慢,无法实时查看网络摄像头

Python kivy应用程序速度慢,无法实时查看网络摄像头,python,kivy,Python,Kivy,我正在尝试制作一个kivy应用程序来实时显示从网络摄像头抓取的图像。它可以工作,但速度很慢,我想知道是否有人知道如何解决这个问题,或者知道使用不同的方法。所谓慢,我的意思是在显示连续图像之间有很大的延迟 代码很简单,只是由一个矩形组成,通过texture.blit_buffer显示从相机抓取的图像。有一个“播放”按钮用于启动和停止图像显示 我已经安排矩形上的纹理每0.02秒更新一次,并且使用pythons时间模块,我能够对更新纹理的函数的执行进行计时。函数大约每0.02秒调用一次并执行一次,因此

我正在尝试制作一个kivy应用程序来实时显示从网络摄像头抓取的图像。它可以工作,但速度很慢,我想知道是否有人知道如何解决这个问题,或者知道使用不同的方法。所谓慢,我的意思是在显示连续图像之间有很大的延迟

代码很简单,只是由一个矩形组成,通过texture.blit_buffer显示从相机抓取的图像。有一个“播放”按钮用于启动和停止图像显示

我已经安排矩形上的纹理每0.02秒更新一次,并且使用pythons时间模块,我能够对更新纹理的函数的执行进行计时。函数大约每0.02秒调用一次并执行一次,因此问题不在于函数本身太慢。这就是我挂断电话的地方。还有什么原因导致显示的图像更新如此缓慢

无论如何,这是.py文件

import numpy as np
import cv2

from kivy.app import App
from kivy.uix.widget import Widget 

from kivy.core.window import Window 
from kivy.uix.button import Button
from kivy.graphics.texture import Texture
from kivy.clock import Clock

from kivy.properties import NumericProperty

import time


class WebcamGUI(Widget):

    IsPlaying = False
    Event = None

    Size_x = 640
    Size_y = 480

    texture = Texture.create(size=(Size_x,Size_y),colorfmt='bgr')
    frame = np.ones(shape=[Size_x, Size_y, 3], dtype=np.uint8)
    data = frame.tostring()
    texture.blit_buffer(data, colorfmt='bgr', bufferfmt='ubyte')

    cap = cv2.VideoCapture(0)

    t = time.time()

    def GetFrame(self,dt):
        ret, frame = self.cap.read()
        frame1 = cv2.flip(frame, 0)
        data = frame1.tostring()
        self.texture.blit_buffer(data, colorfmt='bgr', bufferfmt='ubyte')
        print(time.time()-self.t)
        self.t = time.time()

    def Play(self):
        self.IsPlaying = not self.IsPlaying
        if self.IsPlaying:
            self.Event = Clock.schedule_interval(self.GetFrame,0.02)
        else:
            self.Event.cancel()

class WebcamGUIApp(App):
    def build(self):
        GUI = WebcamGUI()
        return GUI

    def on_stop(self):
        self.cap.release()

if __name__ == '__main__':
    Window.fullscreen = False
    WebcamGUIApp().run()
    cv2.destroyAllWindows()

以下是.kv文件:

#:kivy 1.0.9

<WebcamGUI>:
    canvas:
        Rectangle:
            pos: 100,100
            size: self.Size_x,self.Size_y   
            texture: self.texture   
    ToggleButton:
        pos: (10,10)
        size: 100,25
        text: "Play"
        on_press: root.Play()
#:kivy 1.0.9
:
画布:
矩形:
位置:100100
大小:self.size\x,self.size\y
纹理:自我纹理
切换按钮:
职位:(10,10)
尺码:100,25
文字:“播放”
按:root.Play()