Kivy - 攝像頭



使用 Kivy 中的 Camera 元件,可以顯示來自攝像頭裝置的影片流。Kivy 可能需要一些時間來初始化攝像頭裝置,並在之後更新元件紋理。

Camera 類在 "kivy.uix.camera" 模組中定義。

from kivy.uix.camera import Camera
cam = Camera(**kwargs)

如果系統找到多個攝像頭裝置,則需要透過其索引指定要使用的攝像頭。

cam = Camera(index=1)

您還可以使用 resolution 引數指定攝像頭解析度 -

cam = Camera(index=1, resolution=(640, 480))

kivy.uix.camera.Camera 類是來自 "kivy.core.camera" 模組的核心 Camera 類的具體實現,並執行初始化和幀捕獲功能。

Kivy 需要找到合適的攝像頭提供程式才能檢測硬體。為此,請安裝最新版本的 opencv-python 包,該包還安裝其依賴項包,包括 NumPy。

pip install opencv-python

要在應用程式視窗上開始從攝像頭流式傳輸饋送,請將 Camera 物件的 play 屬性設定為 True,並將其設定為 False 以停止饋送。

cam.play = True

要將攝像機流的快照捕獲到影像,請使用 export_to_png() 方法。指定要儲存到的檔名。

Camera 類定義了以下屬性 -

  • index - 使用的攝像頭的索引,從 0 開始。將其設定為 -1 以允許自動選擇。

  • play - 布林值,指示攝像頭是否正在播放。您可以透過設定此屬性來啟動/停止攝像頭 -

# create the camera, and start later (default)
cam = Camera()

# and later
cam.play = True

# to sop
cam.play = False
  • resolution - 呼叫攝像頭時要使用的首選解析度。如果您使用 [-1, -1],則解析度將為預設解析度。要設定所需的解析度,前提是裝置支援 -

cam = Camera(resolution=(640, 480))

示例

以下示例程式碼在垂直 BoxLayout 中添加了一個 Camera 元件和一個 ToggleButton。繫結到切換按鈕的回撥在按鈕按下時將攝像頭物件的 play 屬性設定為 True,否則影片將停止。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.camera import Camera
from kivy.core.window import Window

Window.size = (720,350)

class TestCameraApp(App):
   def build(self):
      box=BoxLayout(orientation='vertical')
      self.mycam=Camera(play=False, resolution= (640, 480))
      box.add_widget(self.mycam)
      tb=ToggleButton(text='Play', size_hint_y= None, height= '48dp')
      tb.bind(on_press=self.play)
      box.add_widget(tb)
      return box

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

輸出

執行程式碼並檢查輸出 -

Kivy Camera

您還可以使用 "kv" 語言指令碼設計應用程式窗口布局。將以下指令碼另存為 "TestCamera.kv",註釋掉 build() 方法中的程式碼,並在其中放置一個 "pass" 語句。

BoxLayout:
   orientation: 'vertical'
   Camera:
      id: camera
      resolution: (640, 480)
      play: False
   ToggleButton:
      text: 'Play'
      on_press: camera.play = not camera.play
      size_hint_y: None
      height: '48dp'
廣告