Kivy - 相機處理



Kivy 框架透過特定平臺的提供程式支援相機硬體。“opncv-python”包可在大多數作業系統上為 Kivy 提供相機支援。因此,建議在 Kivy 的工作環境中安裝 opencv-python 包。

在本章中,我們將使用 Kivy 庫的 Camera 類構建一個相機應用程式。相機小部件以及一個切換按鈕和一個普通按鈕放置在一個垂直的盒子佈局中,以構建應用程式介面。

相機例項以初始播放狀態 True 開始,這意味著應用程式視窗將在載入後立即從相機啟動影片流。切換按鈕在按下時停止相機。它繫結到 play() 方法。只有在相機正在播放時,“捕獲”按鈕才處於啟用狀態。

def play(self, instance):
   if instance.state=='down':
      self.mycam.play=False
      instance.text='Play'
      self.cb.disabled=True
   else:
      self.mycam.play=True
      instance.text='Stop'
      self.cb.disabled=False

“捕獲”按鈕透過呼叫 Camera 物件的 export_to_png() 方法將當前幀儲存到 PNG 檔案。

捕獲影像後,Kivy 會彈出一個標題為“影像已捕獲”的訊息框。

def capture(self, instance):
   if self.tb.text == 'Stop':
      self.mycam.export_to_png("IMG.png")
      layout = GridLayout(cols=1)

      popup = Popup(
         title='Image Captured', title_size=24,
         content=layout, auto_dismiss=True,
         size_hint=(None, None), size=(300, 100)
      )
   popup.open()

其餘程式碼涉及在 build() 方法中組成應用程式介面。

示例

完整的程式碼如下所示:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.button import Button
from kivy.uix.popup import Popup
from kivy.uix.camera import Camera
from kivy.core.window import Window

Window.size = (720, 400)

class TestCamera(App):
   def build(self):
      box = BoxLayout(orientation='vertical')
      self.mycam = Camera(play=True, resolution=(640, 480))

      box.add_widget(self.mycam)
      self.tb = ToggleButton(
         text='Stop', size_hint_y=None,
         height='48dp', on_press=self.play
      )
      box.add_widget(self.tb)

      self.cb = Button(
         text='Capture', size_hint_y=None, height='48dp',
         disabled=False, on_press=self.capture
      )
      box.add_widget(self.cb)
      return box
      
   def play(self, instance):
      if instance.state == 'down':
         self.mycam.play = False
         instance.text = 'Play'
         self.cb.disabled = True
      else:
         self.mycam.play = True
         instance.text = 'Stop'
         self.cb.disabled = False
         
   def capture(self, instance):
      if self.tb.text == 'Stop':
         self.mycam.export_to_png("IMG.png")
         layout = GridLayout(cols=1)

         popup = Popup(
            title='Image Captured', title_size=24,
            content=layout, auto_dismiss=True,
            size_hint=(None, None), size=(300, 100)
         )
      popup.open()
      
TestCamera().run()

輸出

應用程式啟動時載入相機例項。請注意,根據系統和相機裝置的不同,啟動可能需要幾秒鐘。切換按鈕的標題為“停止”,捕獲按鈕已啟用。

Kivy Camera Handling

如果按下“停止”按鈕,捕獲按鈕將被停用。啟用後,按下“捕獲”按鈕。當前幀將儲存為“img.png”,並彈出一個對話方塊。

Kivy Image Captured
廣告