Kivy - 相机处理
Kivy 框架通过特定于平台的提供程序支持相机硬件。"opncv-python"包可在大多数操作系统上为 Kivy 提供相机支持。因此,建议在 Kivy 的工作环境中安装 opencv-python 包。
在本章中,我们将使用 Kivy 库的 Camera 类构建一个相机应用程序。Camera 小部件以及 ToggleButton 和普通按钮被放置在垂直框布局中以构建应用程序界面。
Camera 实例以初始播放状态 True 开始,这意味着应用程序窗口将在加载后立即从相机启动视频流。Toggle 按钮在关闭时会停止相机。它绑定到 play() 方法。只有当相机正在播放时,Capture 按钮才会处于启用状态。
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()
输出
相机实例在应用程序启动时加载。请注意,根据系统和相机设备的不同,可能需要几秒钟才能启动。切换按钮的标题为停止,并且捕获按钮已启用。
如果按下"停止"按钮,捕获按钮将被禁用。在启用状态下,按下"捕获"按钮。当前帧将保存为"img.png",并弹出一个弹出框。