Проблема с медленным Kivy приложением для просмотра веб-камеры в режиме реального времени - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь создать приложение для просмотра изображений, снятых с веб-камеры, в режиме реального времени. Это работает, но медленно, и мне интересно, кто знает, как это исправить, или знает, какой другой метод использовать. Под медленным я подразумеваю, что между последовательными отображаемыми изображениями существует большая задержка.

Код прост, просто состоит из прямоугольника, на котором изображение, полученное с камеры, отображается через texture.blit_buffer. Для запуска и остановки отображения изображения есть кнопка «Воспроизведение».

Я запланировал обновление текстуры прямоугольника каждые 0,02 с, и с помощью модуля времени питонов я смог рассчитать время выполнения функции. это обновляет текстуру. Функция вызывается и выполняется примерно каждые 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...