1. ホーム
  2. python

[解決済み] OpenCVウェブカメラをKivyのユーザインタフェースに統合する

2022-02-17 04:56:09

質問内容

現在、私のプログラムはPythonで、OpenCVを使用しています。私はウェブカメラのキャプチャに依存し、私はすべてのキャプチャフレームを処理しています。

import cv2

# use the webcam
cap = cv2.VideoCapture(0)
while True:
    # read a frame from the webcam
    ret, img = cap.read()
    # transform image

ウェブカメラキャプチャーの既存の機能を維持したまま、ボタン付きのKivyインターフェース(または他のグラフィカルユーザーインターフェイス)を作りたいと思います。

こんな例がありました。 https://kivy.org/docs/examples/gen__camera__main__py.html - が、OpenCVで処理するためのWebカメラ画像の取得方法が説明されていません。

古い例を見つけました。 http://thezestyblogfarmer.blogspot.it/2013/10/kivy-python-script-for-capturing.html - は、'screenshot'機能を使用してスクリーンショットをディスクに保存します。その後、保存されたファイルを読み込んで処理することができますが、これは不要なステップのように思われます。

他に試せることはありますか?

解決方法は?

こんな例がありました。 https://groups.google.com/forum/#!topic/kivy-users/N18DmblNWb0

opencvのキャプチャをkivyのテクスチャに変換するので、kivyのインターフェイスに表示する前にあらゆる種類のcv変換を行うことができます。

__author__ = 'bunkus'
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.clock import Clock
from kivy.graphics.texture import Texture

import cv2

class CamApp(App):

    def build(self):
        self.img1=Image()
        layout = BoxLayout()
        layout.add_widget(self.img1)
        #opencv2 stuffs
        self.capture = cv2.VideoCapture(0)
        cv2.namedWindow("CV2 Image")
        Clock.schedule_interval(self.update, 1.0/33.0)
        return layout

    def update(self, dt):
        # display image from cam in opencv window
        ret, frame = self.capture.read()
        cv2.imshow("CV2 Image", frame)
        # convert it to texture
        buf1 = cv2.flip(frame, 0)
        buf = buf1.tostring()
        texture1 = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='bgr') 
        #if working on RASPBERRY PI, use colorfmt='rgba' here instead, but stick with "bgr" in blit_buffer. 
        texture1.blit_buffer(buf, colorfmt='bgr', bufferfmt='ubyte')
        # display image from the texture
        self.img1.texture = texture1

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