2017-08-29 28 views
0

我有一個Kivy小部件,我想充當攝像頭實時預覽的佔位符。我已經找到了網絡攝像頭流的一部分,但我無法完全獲取流來填充空的圖像部件(假設我甚至應該使用圖像部件而不是其他部件)。使用Numpy圖像陣列數據更新Kivy小部件

爲了記錄,我沒有使用相機小部件,因爲它不適用於Raspberry Pi相機,它不是USB網絡攝像機。

這裏是我的相機微件類的代碼:

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

你嘗試使用https://kivy.org/docs/api-kivy.uix.camera.html – PalimPalim

+0

感謝PALIM,正如上文所述,內置Kivy相機微件不挑「開箱即用」地推出了Raspberry Pi相機,並且我花了很長時間才試圖讓其發揮作用,但沒有成功。 – John

+0

對不起,沒有仔細閱讀。 – PalimPalim

回答

1

我不認爲我在這裏有一個明確的解決方案,但一些評論/問題可能有助於前進。

  • 我不認爲你需要重新創建紋理和矩形每次更新,你應該能夠在__init__創建紋理和帆布指令,只是在做每個更新的blit_buffer部分。

  • 我沒有看到任何呼叫_finish_init。是否應該由start()方法調用?另外,您是否確實想要將start()的結果設置爲vs屬性,而不是WebcamVideoFrame對象本身? (好吧,它實際上返回自我,如果我可以假設它是這個代碼,您使用https://github.com/jrosebr1/imutils/tree/master/imutils/video

  • 你肯定能得到你的(目前misindented,至少在你把這裏的代碼),帆布中的說明騎<CV2Camera>規則。

  • 顯然你應該能夠檢查使用self.vs.grabbed正確讀取了數據流。

  • 你並不需要使用Image,任何Widget在kivy畫布,並在其上創建一個矩形,以顯示質地應無問題的工作,假設圖像被正確編碼/轉換)。

+0

謝謝!這是一個很大的幫助。我現在可以通過blit_buffer來填充矩形/紋理。我認爲最大的問題是finish_init從來沒有被調用過,但還有其他一些方法。雖然緩衝區似乎在大約30秒後陷入困境並像素化。也許我超負荷了? – John