Kivy 简明教程

Kivy - Camera Handling

Kivy 框架通过特定于平台的提供程序支持摄像头硬件。“opencv-python”软件包使摄像头支持大多数操作系统上的 Kivy。因此,建议在 Kivy 的工作环境中安装 opencv-python 软件包。

在本章中,我们将使用 Kivy 库的 Camera 类构建一个摄像头应用程序。摄像头小部件与切换按钮和普通按钮放置在垂直框布局中以构建应用程序界面。

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

捕捉按钮将当前帧保存到 PNG 文件,方法是调用相机对象的 export_to_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() 方法中组合应用程序界面。

Example

以下是完整代码 −

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()

Output

摄像头实例将在应用程序启动时加载。请注意,根据系统和摄像头设备,可能需要几秒钟才能启动。切换按钮的标题是停止,并且启用捕捉按钮。

kivy camera handling

如果您按下停止按钮,则捕捉按钮将变为禁用状态。在启用状态下,请按下捕捉按钮。当前帧将作为“img.png”保存,并会出现一个弹出框。

kivy image captured