【发布时间】:2021-10-22 19:25:53
【问题描述】:
我使用 python+kivy (kivycamera.py) 编写了一个摄像头访问类,它正在工作。 kivycamera.py
# from kivymd.app import MDApp
from kivy.uix.image import Image
from kivy.graphics.texture import Texture
from kivy.clock import Clock
import cv2
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDFillRoundFlatButton
import time
# class KivyCamera(MDApp):
class KivyCamera(Image):
def build(self):
layout = MDBoxLayout(orientation='vertical', spacing=10)
self.image = Image()
layout.add_widget(self.image)
self.start_camera_button = MDFillRoundFlatButton(
text="START CAMERA",
pos_hint={'center_x': 0.5, 'center_y': 0.5},
size_hint=(0.4, None),
# size=("100dp", "100dp")
)
self.start_camera_button.bind(on_press=self.start_camera)
layout.add_widget(self.start_camera_button)
self.save_img_button = MDFillRoundFlatButton(
text="TAKE PICTURE",
pos_hint={'center_x': 0.5, 'center_y': 0.5},
size_hint=(0.4, None),
# size=("100dp", "100dp")
)
self.save_img_button.bind(on_press=self.take_picture)
layout.add_widget(self.save_img_button)
# self.video = cv2.VideoCapture(0)
# Clock.schedule_interval(self.load_video, 1.0 / 30.0)
# return layout
# return self.image
def start_camera(self, *args):
self.video = cv2.VideoCapture(0)
Clock.schedule_interval(self.load_video, 1.0 / 30.0)
pass
def load_video(self, *args):
check, frame = self.video.read()
if check:
x, y, w, h = 200, 200, 250, 250
p, q, r, s = 220, 220, 210, 210
frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)
frame = cv2.rectangle(frame, (p, q), (p + r, q + s), (255, 0, 0), 3)
self.image_frame = frame
buffer = cv2.flip(frame, 0).tobytes()
image_texture = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt="bgr")
image_texture.blit_buffer(buffer, colorfmt="bgr", bufferfmt="ubyte")
self.image.texture = image_texture
def take_picture(self, *args):
timestr = time.strftime("%Y%m%d_%H%M%S")
cv2.imwrite("IMG_{}.png".format(timestr), self.image_frame)
cv2.imshow("Hi", self.image_frame)
# KivyCamera().run()
如何仅在需要时将此类添加到另一个 MDApp 或 Screen。我尝试了以下方法,但没有成功。不要预先初始化相机。仅使用按钮操作激活相机。
在单独的 MDApp 中
from kivymd.app import MDApp
from kivycamera import KivyCamera
class DemoApp(MDApp):
pass
# def build(self):
# self.camera = KivyCamera()
# self.camera.build()
# print(self.camera)
# return self.camera
if __name__ == '__main__':
DemoApp().run()
基维文件
BoxLayout:
orientation: 'vertical'
MDLabel:
text: 'Hello'
KivyCamera:
或使用屏幕管理器在单独的屏幕内
class UploadScreen(Screen):
pass
# def build(self):
# self.my_camera = KivyCamera()
# self.my_camera.build()
# self.ids.my_camera = self.my_camera
# return self.my_camera
基维文件
<UploadScreen>:
name: 'upload'
KivyCamera:
【问题讨论】:
标签: python python-3.x kivy opencv-python kivymd