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
广告