Я пытаюсь создать приложение для просмотра изображений, снятых с веб-камеры, в режиме реального времени. Это работает, но медленно, и мне интересно, кто знает, как это исправить, или знает, какой другой метод использовать. Под медленным я подразумеваю, что между последовательными отображаемыми изображениями существует большая задержка.
Код прост, просто состоит из прямоугольника, на котором изображение, полученное с камеры, отображается через 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()