🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

10776閲覧

Python KivyでOpenCVを使ってWebカメラの映像を表示したい

Shinonome_

総合スコア12

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/30 09:05

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2018/09/30 11:33

画像である numpy 配列を kivy.graphics.texture.Texture に変換するところまではわかっているようですが、そのあと具体的にどこらへんがわからないのか記載がないと、回答は付きづらいと思いますよ。
guest

回答1

0

自己解決

自己解決いたしました。
参考にしたコードをWidgetとしてインスタンスを生成し、self.image_textureをkvファイルのtexture:に渡したら出来ました。

Python

1from kivy.app import App 2from kivy.properties import StringProperty, ObjectProperty 3from kivy.uix.widget import Widget 4from kivy.graphics.texture import Texture 5from kivy.uix.image import Image 6from kivy.clock import Clock 7 8from PIL import Image 9import cv2 10 11class ImageWidget(Widget): 12 13 image_texture = ObjectProperty(None) 14 image_capture = ObjectProperty(None) 15 16 def __init__(self, **kwargs): 17 super(ImageWidget, self).__init__(**kwargs) 18 self.image_capture = cv2.VideoCapture(0) 19 Clock.schedule_interval(self.update, 1.0 / 30) 20 21 def update(self, dt): 22 ret, frame = self.image_capture.read() 23 if ret: 24 buf1 = cv2.flip(frame, 0) 25 buf = buf1.tostring() 26 image_texture = Texture.create( 27 size=(frame.shape[1], frame.shape[0]), colorfmt='bgr') 28 image_texture.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte') 29 self.image_texture = image_texture 30 31 32class ImageApp(App): 33 def __init__(self, **kwargs): 34 super(ImageApp, self).__init__(**kwargs) 35 self.title = '' 36 37 def build(self): 38 return ImageWidget() 39 40if __name__ == '__main__': 41 app = ImageApp() 42 app.run()

投稿2018/10/02 15:16

Shinonome_

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問