2017-08-29 17 views
0

Webカメラからのライブプレビューのプレースホルダとして機能したいKivyウィジェットがあります。私はすでにウェブカメラのストリーム部分を把握していますが、空のImageウィジェットを埋めるためにストリームを取得することはできません(私はImageウィジェットを使用する必要があると仮定します)。Numpy Image ArrayデータでKivyウィジェットを更新する

カメラのウィジェットはUSBウェブカメラではないRaspberry Piカメラではうまく動作しないため、私はカメラウィジェットを使用していません。ここで

は私のカメラWidgetクラスのコードです:

class CV2Camera(BoxLayout):  
def __init__(self, **kwargs): 
    super(CV2Camera, self).__init__(**kwargs) 
    self.vs = WebcamVideoStream(src=0).start() 

def _finish_init(self, dt): 
    Clock.schedule_interval(self.update, .05) 

def update(self, dt): 
    self.image = self.vs.read() 
    self.image = imutils.resize(self.image, width=1080) 
    self.image = np.fliplr(self.image) 

    self.video_texture = Texture.create(size=(self.image.shape[1], self.image.shape[0]), colorfmt='bgr') 
    self.video_texture.blit_buffer(self.image.tostring(), colorfmt='bgr', bufferfmt='ubyte') 
    self.video_panel = self.ids['camera_preview'] 
    with self.video_panel.canvas as canvas: 
     Rectangle(texture=self.video_texture, pos=self.video_panel.pos, size=self.video_panel.size) 

そして、ここでは私のレイアウトの宣言です:

<CV2Camera> 
canvas.before: 
    PushMatrix 
canvas.after: 
    PopMatrix 

<PhotoBooth>: 
    Screen: 
     name: 'screen1' 
     GridLayout: 
      cols: 2 
      orientation: 'horizontal' 
      FloatLayout: 
       size_hint: 4, 1 
       CV2Camera: 
        id: camera 
        orientation: 'horizontal' 
        Image: 
         id: camera_preview 
      GridLayout: 
       cols: 1 
       Button: 
        text: "<-Previous Frame" 
       Button: 
        text: "Next Frame->" 
       Button: 
        text: "Take Picture!" 
        on_press: root.capture() 

このコードは正常に動作が、私が得るすべてはどこ灰色の正方形であり、画像/カメラプレビューが表示されるはずです。私はKivyのアーキテクチャーには新しかったが、ここで私を得たウェブの例(this SO threadthis Github projectなど)は、これがうまくいくはずであることを示しているようだ。ありがとう。

+0

あなたはおかげでPalimは、上記で述べたように、内蔵のKivyカメラウィジェット選択しないhttps://kivy.org/docs/api-kivy.uix.camera.html – PalimPalim

+0

を使用して試してみましたラズベリーパイカメラを「すぐに使える」ものにすることができました。私はそれを他の方法でも成功させるには時間がかかりました。 – John

+0

申し訳ありませんが、十分に慎重に読んでいませんでした。 – PalimPalim

答えて

1

私はここに明確な解決策はないと思いますが、進歩に役立ついくつかの発言/質問があります。私はあなたがすべての更新質感や四角形を再作成する必要はないと思う

  • 、あなたは__init__で質感とキャンバス命令を作成し、ちょうど各アップデートでblit_bufferの一部を行うことができるはず。

  • _finish_initへの呼び出しはありません。それはstart()メソッドか何かによって呼び出されるはずですか?また、実際にの結果をvs属性に設定し、WebcamVideoFrameオブジェクト自体に設定しませんでしたか?あなたが確かに(あなたがここに置くコードでは、あなたがここに置いたコードで)あなたの乗り心地を得ることができます。 <CV2Camera>ルール。

  • 明らかに、ストリームが正しく読み取られたかどうかはself.vs.grabbedで確認できるはずです。

  • あなたはどのWidget)はkivyでキャンバスを持って、テクスチャを表示するには、その上に四角形を作成すると、画像が正しく変換された/符号化されていると仮定すると、問題なく動作するはずです、Imageを使用する必要はありません。

+0

ありがとう!これは大きな助けとなりました。 blit_bufferを使って矩形/テクスチャを塗りつぶすことができました。私は、大きな問題はfinish_initが呼び出されていないことだと思っていますが、途中で他の人がいました。バッファーは約30秒後にぶら下がり、ピクセル化しているようです。多分私はそれをオーバーロードですか? – John

関連する問題