Python Kivy(App开发)调用摄像头的样例

10 篇文章 0 订阅
5 篇文章 8 订阅

样例思路

简单来说,kivy只是提供了可以让用户和手机进行交互的框架和接口,我们只要把框架搭好,内部算法的参数传递到框架相应的接口,就能实现交互。所以实际上,底层算法并不会改变,改变的是输入输出方式。
kivy代码原文链接:https://kivy.org/doc/stable/examples/gen__camera__main__py.html#
编译器:Pycharm
Kivy版本:1.11

效果展示

在这里插入图片描述
在这里插入图片描述

Kivy语言编写界面

Builder.load_string('''
<CameraClick>:
    orientation: 'vertical'
    Camera:
        id: video #关键,调用OpenCV函数
        resolution: (640, 480)
        play: False
    ToggleButton:
        text: 'Play'
        on_press: video.play = not video.play
        size_hint_y: None
        height: '48dp'
    Button:
        text: 'Capture'
        size_hint_y: None
        height: '48dp'
        on_press: root.capture()
''')

在我之前的基础部分,我没有详细地说过Kivy语言,因为它非常简单,几乎都是描述性的语句。从上面的代码可以看出,需要调用的函数写在最前面,用<>进行包裹,它必须与我们在主程序中定义的类的名字一致,kivy才能调用。接着定义函数中的widgets,比如这里我们定义的Camera,Button等,都是Kivy的widgets,可以看出,非常简洁明了。在这些函数后面,跟着这些函数内部的参数名,冒号:之后就是对参数的定义。

这部分的关键在于,Camera函数那里,我们在Kivy内对Python进行了访问,调用OpenCV函数,然后Python对整个kivy语言用Builder.load_string进行访问,调用内部函数,实现界面布局设计。这样相互之间就建立了信息交流通道。我想强调的就是这个做法,Kivy为Python提供了交互接口。

实际上,我们可以单独写一个以.kv为拓展名的Kivy文件,在程序运行的时候自动调用.ky,使得代码更加简洁。

把OpenCV函数输出到Kivy窗口

class CameraClick(BoxLayout):
    def capture(self):
        camera = self.ids['video']
        timestr = time.strftime("%Y%m%d_%H%M%S")
        camera.export_to_png("IMG_{}.png".format(timestr))
        print("Captured")

我们在这里定义一个对相机画面进行简单操作的盒式布局的类。调用Kivy语言中相机的ids,根据我们在Kivy语言中设置的名字,它叫做video,如果需要直接调用,就不用kivy语言写这句代码,看个人习惯。

总结

需要注意的是,Kivy目前在国内不流行,所以在打包的时候需要外面的资源,只能翻过去下载,不稳定也慢。Kivy也不够成熟。

程序

from kivy.app import App
#使用Kivy语言
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
import time

#使用Kivy语言编写界面框架
Builder.load_string('''
<CameraClick>:
    orientation: 'vertical'
    Camera:
        id: video
        resolution: (640, 480)
        play: False
    ToggleButton:
        text: 'Play'
        on_press: video.play = not video.play
        size_hint_y: None
        height: '48dp'
    Button:
        text: 'Capture'
        size_hint_y: None
        height: '48dp'
        on_press: root.capture()
''')
#创建盒式布局类,实现截图
class CameraClick(BoxLayout):
    def capture(self):
        camera = self.ids['video']
        timestr = time.strftime("%Y%m%d_%H%M%S")
        camera.export_to_png("IMG_{}.png".format(timestr))
        print("Captured")
#主程序
class TestCamera(App):
    def build(self):
        return CameraClick()

TestCamera().run()
  • 8
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值