我正在用网络摄像头使用Kivy。我在this example之后跟随@Arnav,使用opencv来形成相机并将其显示为小部件。我已经在python中“扩展”了布局,以添加两个按钮作为测试,以准备更复杂的布局。

class CamApp(App):
    def build(self):
        self.capture = cv2.VideoCapture(0)
        self.my_camera = KivyCamera(capture=self.capture, fps=30,resolution=(1920,1080))
        root = BoxLayout(orientation = 'vertical')
        root.add_widget(self.my_camera,1)
        box2 = BoxLayout(orientation = 'vertical')
        btn1 = Button(text='Hello world 1')
        btn2 = Button(text='Hello world 2')
        box2.add_widget(btn1)
        box2.add_widget(btn2)
        root.add_widget(box2, 0)
        return root
        #return Builder.load_string(kv)

尽管这样做有效,但我还是希望将UI组件移出python并移入kv language文件。
问题是知道如何在self.my_camera文件中“描述” kv吗?

我不确定是否在KivyCamera文件内将widget类作为kv继承,即
kv = '''
<Cam1@KivyCamera>:
    texture: self.my_camera
    resolution: (1920, 1080)
    pos: self.pos
    size: self.size

还是是否使用canvas小部件
<MyWidget>:
    canvas:
        Rectangle:
            source: self.my_camera
            pos: self.pos
            size: self.size

我尝试了其他“被黑客入侵”的实现,但是在所有情况下,问题都是通过self.my_camera链接到kv文件中。

有什么建议么?

最佳答案

也许这个例子可以帮助您。

# Import 'kivy.core.text' must be called in entry point script
# before import of cv2 to initialize Kivy's text provider.
# This fixes crash on app exit.

import kivy.core.text
import cv2
from kivy.app import App
from kivy.base import EventLoop
from kivy.uix.image import Image
from kivy.clock import Clock
from kivy.graphics.texture import Texture
from kivy.uix.boxlayout import BoxLayout
from kivy.core.window import Window


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):
        return_value, frame = self.capture.read()
        if return_value:
            texture = self.texture
            w, h = frame.shape[1], frame.shape[0]
            if not texture or texture.width != w or texture.height != h:
                self.texture = texture = Texture.create(size=(w, h))
                texture.flip_vertical()
            texture.blit_buffer(frame.tobytes(), colorfmt='bgr')
            self.canvas.ask_update()


capture = None


class QrtestHome(BoxLayout):

    def init_qrtest(self):
        pass

    def dostart(self, *largs):
        global capture
        capture = cv2.VideoCapture(0)
        self.ids.qrcam.start(capture)

    def doexit(self):
        global capture
        if capture != None:
            capture.release()
            capture = None
        EventLoop.close()


class qrtestApp(App):

    def build(self):
        Window.clearcolor = (.4,.4,.4,1)
        Window.size = (400, 300)
        homeWin = QrtestHome()
        homeWin.init_qrtest()
        return homeWin

    def on_stop(self):
        global capture
        if capture:
            capture.release()
            capture = None

qrtestApp().run()

和kv文件:
<QrtestHome>:

    BoxLayout:
        orientation: "vertical"

        Label:
            height: 20
            size_hint_y: None
            text: 'Testing the camera'

        KivyCamera:
            id: qrcam

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

            Button:
                id: butt_start
                size_hint: 0.5,1
                text: "start"
                on_press: root.dostart()

            Button:
                id: butt_exit
                text: "quit"
                size_hint: 0.5,1
                on_press: root.doexit()

关于python - Kivy Camera作为KV语言小部件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40862009/

10-13 00:05