実現したいこと
OpenCVで読み込んだWebカメラの映像を私の作ったGUIの一部に埋め込みたいと考えております。
しかし、Kivyをはじめて3日の私はどうすればよいか、わかりませんでした。
以下のコードを参考にして、OpenCVのVideoCapture()で読み込んだデータをtextureに変換すればKivyでtextureとして表示できることはわかりました。それの私のコードに実装する方法を教えてください。宜しくお願いします。
埋め込みたい位置は実行して左側のImageです。(Kivy: 18行目)
参考にしたコード
# coding:utf-8 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()
自分のPythonコード
Python
1from kivy.app import App 2from kivy.lang import Builder 3from kivy.uix.widget import Widget 4from kivy.uix.gridlayout import GridLayout 5from kivy.uix.label import Label 6from kivy.uix.image import Image 7from kivy.graphics.texture import Texture 8from kivy.properties import ObjectProperty 9from kivy.core.window import Window 10from kivy.uix.screenmanager import Screen 11from kivy.graphics import Color, Rectangle 12from kivy.clock import Clock 13import cv2 14Window.size = (800, 460) 15 16Builder.load_file('sample.kv') 17 18class Screen(Screen): 19 20 count = 0 21 img_src='' 22 posX=100 23 posY=200 24 R=300 25 result='RESULT' 26 accuracy=1 27 28 def __init__(self, **kwargs): 29 30 super(Screen,self).__init__(**kwargs) 31 32 def add(self): 33 34 self.count += 1 35 layout1 = GridLayout(cols=4, size_hint=(1, None), height=60, padding=5) 36 layout1.add_widget(Label(text='[' + str(self.count) + ']')) 37 layout1.add_widget(Image(source=self.img_src)) 38 39 layout2 = GridLayout(rows=2) 40 layout2.add_widget(Label(text=self.result)) 41 layout2.add_widget(Label(text=str(self.accuracy))) 42 43 layout3 = GridLayout(rows=3) 44 layout3.add_widget(Label(text=str(self.posX))) 45 layout3.add_widget(Label(text=str(self.posY))) 46 layout3.add_widget(Label(text=str(self.R))) 47 48 layout1.add_widget(layout2) 49 layout1.add_widget(layout3) 50 51 self.ids.widget_list.add_widget(layout1) 52 53 def remove(self): 54 self.ids.widget_list.clear_widgets() 55 56 57class SampleApp(App): 58 59 def build(self): 60 self.capture = cv2.VideoCapture(0) 61 self.screen = Screen() 62 self.title = 'Sample_Code' 63 return self.screen 64 65if __name__ == '__main__': 66 SampleApp().run()
自分のKivyコード
Kivy
1<Screen>: 2 BoxLayout: 3 size: root.size 4 padding: 10 5 orientation: 'vertical' 6 BoxLayout: 7 size_hint_y: 0.1 8 Label: 9 text: 'Total number : -----------' 10 Label: 11 text: 'Total fee : -----------' 12 13 BoxLayout: 14 size_hint_y: 0.8 15 padding: 10 16 Image: 17 size_hint_x: 0.6 18 texture: 19 20 ScrollView: 21 size_hint_x: 0.4 22 23 GridLayout: 24 size_hint_y: None 25 height: self.minimum_height 26 id: widget_list 27 cols: 1 28 rows: 20 29 orientation: 'vertical' 30 31 canvas.before: 32 Color: 33 rgba: 1, 1, 1, 0.2 34 Rectangle: 35 pos: self.pos 36 size: self.size 37 38 AnchorLayout: 39 anchor_x: 'right' 40 size_hint_y: 0.1 41 BoxLayout: 42 size_hint: (None, None) 43 size: (300, 40) 44 BoxLayout: 45 padding: 5 46 Button: 47 text: 'Add' 48 on_press: root.add() 49 BoxLayout: 50 padding: 5 51 Button: 52 text: 'Remove' 53 on_press: root.remove() 54
補足情報
Python 3.6.4
Kivy 1.10.1
回答1件
あなたの回答
tips
プレビュー