将Kivy与OpenCv一起使用.此解决方案在退出时崩溃



我找到了一个可能的解决方案来获得我需要的东西,但是当我单击退出按钮时,程序冻结了。必须有一种更优雅的方式来让它在不崩溃的情况下工作。是否需要全部使用全局? 我正在使用python3.6和使用Kivy 1.10.0

Kivy相机作为KV语言小部件

好吧,我没有添加退出功能,但是它似乎可以导航到其他屏幕并返回而不会崩溃。我将fps和捕获部分直接放入KivyCamera类中。

import kivy.core.text
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.scrollview import ScrollView
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.base import runTouchApp
from kivy.clock import Clock
from kivy.uix.image import Image
import time
import cv2
from kivy.uix.boxlayout import BoxLayout
from kivy.graphics.texture import Texture
class KivyCamera(Image):
def __init__(self, **kwargs):
super(KivyCamera, self).__init__(**kwargs)
self.capture = cv2.VideoCapture(0)
self.fps = 30
Clock.schedule_interval(self.update, 1.0 / self.fps)


def update(self, dt):
ret, frame = self.capture.read()
if ret:
# convert it to texture
buf1 = cv2.flip(frame, 0)
buf = buf1.tostring()
image_texture = Texture.create(
size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
# display image from the texture
self.texture = image_texture
self.canvas.ask_update()
class MainScreen(Screen):
pass
class OptionsScreen(Screen):
pass

class AlarmScreen(Screen):
pass
class Project_1App(App):
def build(self):
screenManager = ScreenManager()
screenManager.add_widget(MainScreen(name="main"))
screenManager.add_widget(OptionsScreen(name="options"))
screenManager.add_widget(AlarmScreen(name="alarm"))
return screenManager


Project_1App().run()

和基维位:

<MainScreen>:               
BoxLayout:
orientation: "vertical"
KivyCamera:
Label:
height: 20
size_hint_y: None
text: 'Cam_01'

BoxLayout:
orientation: "horizontal"
height: 50
size_hint_y: None

Button:
text: "Options"
size_hint_y: None
width: 150
height: 50
on_release: root.manager.current = 'options' 
<OptionsScreen>
GridLayout:
rows:3
cols:1
padding: 10
spacing: 10
Button:
text: "Main Screen"
size_hint_y: None
width: 150
height: 50
on_release: root.manager.current = 'main'
Button:
text: "Alarm"
size_hint_y: None
width: 150
height: 50

on_release: root.manager.current = 'alarm'

Button:
text: "test"
size_hint_y: None
width: 150
height: 50
<AlarmScreen>
GridLayout:
rows:3
cols:1
padding: 10
spacing: 10
Button:
text: "Main Screen"
size_hint_y: None
width: 150
height: 50
on_release: root.manager.current = 'main'
Button:
text: "Options"
size_hint_y: None
width: 150
height: 50

on_release: root.manager.current = 'options'

Button:
text: "test"
size_hint_y: None
width: 150
height: 50

相关内容

最新更新