Kivy: OpenCV3では白い画面ですが、OpenCV2では機能します

作成日 2017年09月25日  ·  10コメント  ·  ソース: kivy/kivy

バージョン

  • Python:v2.7.12
  • OS:Linux(Gentoo)
  • Kivy:1.10.0
  • Kivyのインストール方法:pip install kivy == 1.10.0

説明

ここから公式のサンプルコードを使用して、Kivyでカメラを使用したいと思います。
https://github.com/kivy/kivy/blob/1.10.0/examples/camera/main.py
ただし、 opencv-3.3.0|. If I compile opencv-2.4.13.3`からcv2.soを使用すると、白い画面しか表示されません。
どちらの場合も、カメラは初期化されているように見えますが(LEDがオンになっている)、opencv-2を使用するとビデオが表示され、opencv-3を使用すると画面が白のままになります。
また、以下のよりミニマリストな例を試してみました。

import kivy

from kivy.app import App
from kivy.uix.camera import Camera

class MainApp(App):
    def build(self):
        return Camera(play=True, resolution=(640, 480))

if __name__== "__main__":
    MainApp().run()

そして、同じ結果が得られます。つまり、 opencv-2.4.13.3ではなくopencv-3.3.0ます。

https://github.com/opencv/opencv/releasesから両方のバージョンをダウンロードしました
そして、それらは両方ともデフォルトのフラグ(単にcmakeそしてmake -j4 )でコンパイルされました。
また、以下の純粋なOpenCVの例も機能しています。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Display the resulting frame
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

そのため、Kivyとの統合に問題があるように見えます。

最も参考になるコメント

それを解決しました。 ファイル.../lib/python3.6/site-packages/kivy/core/camera/camera_opencv.py見てください
121行目:

        if self.fps <= 0:
            self.fps = 1 / 30.

デバッグモードでそこに到達すると、fps値が実際には30であることがわかります(1/30ではありません)。
この値は、フレーム更新のスケジューリングに使用されます。

self._update_ev = Clock.schedule_interval(self._update, self.fps)

この行を次のように変更します。

self._update_ev = Clock.schedule_interval(self._update, 1/self.fps)

問題を解決します。 もちろん、これは完全な解決策ではありません。おそらく、コード内の他の場所も変更する必要があります。
これがあなたにもうまくいくことを願っています

全てのコメント10件

問題を確認できます

opencv3の白い画面もあります。
デバッグしたところ、着信フレームが空ではないことがわかりましたが、それでも画面にうまく表示されません

それを解決しました。 ファイル.../lib/python3.6/site-packages/kivy/core/camera/camera_opencv.py見てください
121行目:

        if self.fps <= 0:
            self.fps = 1 / 30.

デバッグモードでそこに到達すると、fps値が実際には30であることがわかります(1/30ではありません)。
この値は、フレーム更新のスケジューリングに使用されます。

self._update_ev = Clock.schedule_interval(self._update, self.fps)

この行を次のように変更します。

self._update_ev = Clock.schedule_interval(self._update, 1/self.fps)

問題を解決します。 もちろん、これは完全な解決策ではありません。おそらく、コード内の他の場所も変更する必要があります。
これがあなたにもうまくいくことを願っています

上記の「ソリューション」はいずれも、Python2.7.14およびopencv3を使用するUbuntu18.04(ベータリリース)では機能しません。
ウェブカメラはチーズのようなデスクトップアプリで動作しています。
私たちbraintrainerplus.nlは、本当にWebカメラが機能している必要があり、誰かが興味を持っている場合は、この問題に報奨金を支払う準備ができています。

opencvから返されたnumpy配列データを表示する前に、前処理したかったのです。 残念ながら、kivyのカメラ抽象化はテクスチャバイナリデータしか提供しませんでした。

この要点は、カメラに直接アクセスするのに役立ちました。

https://gist.github.com/ExpandOcean/de261e66949009f44ad2

参考:opencv 2.4.13は、Ubuntu18.04のkivy1.10で動作します。
(私の最初の試みが失敗した理由はわかりませんが、別のコンパイル後には機能しました)

@yoelkの「修正」がOpenCV3.3.0を使用する

これはhttps://github.com/kivy/kivy/issues/5146と同じ問題のように見え

@yoelk私の121行目は
if self.fps <= 0: self.fps = 1 / 30

そして、私は白い画面を取得しています。 ダウングレードしようとして、pipまたはcondaを使用してopencv2をダウンロードできません

私は、ビルドインバイソンとUSBロジクールのウェブカメラでテストが、今@yoelkからの修正と安定kivy 1.10.1に取り組んでいることを確認することができます。
システム: ppa:kivy-team / kivyのUbuntu18.04 / Mint 19、openvc 3.2.0、

また、kivy / core / camera / __ init__。pyのopencvを除くすべてのプロバイダーをコメントアウトして、opencvの使用を強制する必要があります。残りは失敗し、あらゆる種類の奇妙なエラーが発生します。

@CurtlyCritchlow修正は152行

このページは役に立ちましたか?
0 / 5 - 0 評価