样例思路
简单来说,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()