0

ねえ、私はopencvとkivyで作業しようとしています。私のコードは、画面上部にアクションバーを追加できない KivyCamera というクラスを返します。アクションバーとopencvウェブカメラをKivy GUIフレームワークに同時に追加する方法はありますか? ありがとう。また、そうする場合

def build: camApp の build 関数の代わりに python スクリプトを渡すと、アクションバーが表示されます。それらを組み合わせる方法がわからないだけです。

Python ファイル:

from kivy.app import App
from kivy.uix.image import Image
from kivy.clock import Clock
from kivy.graphics.texture import Texture
import cv2

class KivyCamera(Image):
    def __init__(self, capture, fps, **kwargs):
        super(KivyCamera, self).__init__(**kwargs)
        self.capture = capture
        Clock.schedule_interval(self.update, 1.0 / 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


class CamApp(App):
    def build(self):
        self.capture = cv2.VideoCapture(1)
        self.my_camera = KivyCamera(capture=self.capture, fps=30)
        return self.my_camera

    def on_stop(self):
        #without this, app will not exit even if the window is closed
        self.capture.release()


if __name__ == '__main__':
    CamApp().run()

kv ファイル:

#:kivy 1.8.0
#:import KivyLexer kivy.extras.highlight.KivyLexer
#:import Factory kivy.factory.Factory

<ActionSpinnerOptions@SpinnerOption>
    background_color: .4, .4, .4, 1

<ActionSpinner@Spinner+ActionItem>
    canvas.before:
        Color:
            rgba: 0.128, 0.128, 0.128, 1
        Rectangle:
            size: self.size
            pos: self.pos
    border: 27, 20, 12, 12
    background_normal: 'atlas://data/images/defaulttheme/action_group'
    option_cls: Factory.ActionSpinnerOptions

<ActionDropdown>:
    on_size: self.width = '220dp'

<ShowcaseScreen>:
    ScrollView:
        do_scroll_x: False
        do_scroll_y: False if root.fullscreen else (content.height > root.height - dp(16))
        AnchorLayout:
            size_hint_y: None
            height: root.height if root.fullscreen else max(root.height, content.height)
            GridLayout:
                id: content
                cols: 1
                spacing: '8dp'
                padding: '8dp'
                size_hint: (1, 1) if root.fullscreen else (.8, None)
                height: self.height if root.fullscreen else self.minimum_height


BoxLayout:
    orientation: 'vertical'

    canvas.before:
        Color:
            rgb: .6, .6, .6
        Rectangle:
            size: self.size
            source: 'data/background.png'

    ActionBar:

        ActionView:
            id: av
            ActionPrevious:
                with_previous: (False if sm.current_screen.name == 'button' else True) if sm.current_screen else False
                title: 'Showcase' + ('' if not app.current_title else ' - {}'.format(app.current_title))
                on_release: app.go_hierarchy_previous()

            ActionSpinner:
                id: spnr
                important: True
                text: 'Jump to Screen'
                values: app.screen_names
                on_text:
                    if sm.current != args[1]:\
                    idx = app.screen_names.index(args[1]);\
                    app.go_screen(idx)
            ActionToggleButton:
                text: 'Toggle sourcecode'
                icon: 'data/icons/sourcecode.png'
                on_release: app.toggle_source_code()
            ActionButton:
                text: 'Previous screen'
                icon: 'data/icons/prev.png'
                on_release: app.go_previous_screen()

            ActionButton:
                text: 'Next screen'
                icon: 'data/icons/next.png'
                on_release: app.go_next_screen()
                important: True

    ScrollView:
        id: sv
        size_hint_y: None
        height: 0

        CodeInput:
            id: sourcecode
            lexer: KivyLexer()
            text: app.sourcecode
            readonly: True
            size_hint_y: None
            font_size: '12sp'
            height: self.minimum_height

    ScreenManager:
        id: sm
        on_current_screen:
            spnr.text = args[1].name
            idx = app.screen_names.index(args[1].name)
            if idx > -1: app.hierarchy.append(idx)
4

1 に答える 1

0

(注: 私はまだ opencv を使用したことがなく、pypi で見つけることができません)

あなたのクラスKivyCameraは、Kivy で使用されるカジュアルなウィジェットにすぎません。あなたが行うとどうなるかとdef build(self): passいうと、ファイルを開き、kvルートウィジェットとして使用できるものを見つけることです.あなたの場合はおそらくBoxLayout:under <ShowcaseScreen>:.

これでできることは、ファイルに入れ<KivyCamera>:てみることです。kvそれだけで、その下には何もありません。次に、その中にKivyCamera:どこかに入れます(別の としてそこに入れるBoxLayout:のが最善です)、それを表示する必要があります。デフォルトではとの重複を禁止する必要があるため、ここではサイジングは問題になりません。ScreenManagerScreenBoxLayoutActionBarKivyCamera

于 2016-08-27T15:28:47.977 に答える