使用pysimplegui+opencv编写一个摄像头的播放器

需求

使用pysimplegui和opencv实现一个播放器,播放 摄像头的画面。

代码实现


import cv2
import time
from typing import Iterable, NamedTuple, Optionalimport PySimpleGUI as sgclass CameraSpec(NamedTuple):name: strindex: intwidth: intheight: intfps: intdef init_window(theme_name: str = "DarkBlack", window_name: str = "UVC capture"):print(f"init theme with name {theme_name!r}")sg.theme(theme_name)layout = [[sg.Text('UVC Demo', size=(60, 1), justification='center')],[sg.Image(filename='', key='-IMAGE-')],[sg.Button('退出', size=(10, 1), key='-Exit-')]]print(f"init window with name {window_name!r}")window = sg.Window(window_name, layout, location=(10, 10), resizable=True)return windowdef main(camera_spec: CameraSpec):print(f"init {camera_spec.index}th camera with name {camera_spec.name}")capture = cv2.VideoCapture(camera_spec.index)if capture == None:print(f"No matching camera with CameraSpec {camera_spec} found")returnsize = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))print(f"get size:{size}")wret = capture.set(cv2.CAP_PROP_FRAME_WIDTH, camera_spec.width)hret = capture.set(cv2.CAP_PROP_FRAME_HEIGHT, camera_spec.height)print(f"wret:{wret} hret:{hret}")size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))print(f"get size:{size}")window = init_window(window_name=camera_spec.name)#last_update = time.perf_counter()try:keep_running = Truei  = 0while keep_running:before = time.perf_counter()event, values = window.read(timeout=5)if event == '-Exit-' or event == sg.WIN_CLOSED:breakafter_event = time.perf_counter()print(f"====after_event:{after_event-before}====")try:_, frame = capture.read()except TimeoutError:passelse:after_frame = time.perf_counter()print(f"after_frame:{after_frame-after_event}")#将每一帧编码成png播放imgbytes = cv2.imencode('.png', frame)[1].tobytes()after_show = time.perf_counter()print(f"after_show:{after_show-after_frame}")print(f"sum:{after_show-before}")window['-IMAGE-'].update(data=imgbytes)#cv2.imshow(camera_spec.name, bgr)  # if cv2.waitKey(1) & 0xFF == 27:#    break  # with open(f"bgr{i}.bgr",'wb') as f:#     f.write(bgr)# i += 1except KeyboardInterrupt:passcapture.close()print(f"close camera:{camera_spec}")if __name__ == "__main__":main(CameraSpec(name="播放摄像头测试",index=0, #摄像头编号width=1280,height=720,fps=10,),)

效果:
在这里插入图片描述

代码说明

打开摄像头:

capture = cv2.VideoCapture(camera_spec.index)

从摄像头取帧:

_, frame = capture.read()

将帧送到窗口播放:

#将每一帧编码成png图片
imgbytes = cv2.imencode('.png', frame)[1].tobytes()
window['-IMAGE-'].update(data=imgbytes)  #这里播放

由于使用PySimpleGUI的Image作为播放控件,所以每一帧都要转换成图片。除了png, 好像tif也可以,我没试。
从这里也可以看出来,pysimplegui播放的效率还是有点低的,要先编码成图片。但是作为一些小工具来讲,可以接受。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/424244.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink中的时间和窗口(时间语义,水位线,窗口,迟到数据的处理)

目录 Flink中的时间和窗口 1时间语义 1.1Flink中的时间语义 1.1.1处理时间 1.1.2事件时间 1.2那种时间语义更重要 2 水位线 2.1 事件时间和窗口 2.2 什么是水位线 2.3 如何生成水位线 2.3.1使用WatermarkGenerator 2.3.2使用SourceFunction 2.4 水位线的传递 2.5 水位…

数据结构之最优二叉树

数据结构之最优二叉树 1、最优二叉树2、哈夫曼编码 数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数…

个人云服务器docker搭建部署前后端应用-myos

var code "87c5235c-b551-45bb-a5e4-9593cb104663" mysql、redis、nginx、java应用、前端应用部署 本文以单台云服务器为例: 1. 使用腾讯云服务器 阿里或其他云服务器皆可,类似 安装系统,现在服务器系统都集成安装了docker镜像&a…

GPTs Store 推荐的学术类应用,效果怎么样?

(注:本文为小报童精选文章,已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) 哪些 GPTs ,会令我们眼前一亮? 最近 GPTs Store 已经正式发布,提供了推荐应用和各分类板块目前的热门趋势…

网络通信(15)-C#TCP客户端掉线重连实例

本文上接前面的文章使用Socket在C#语言环境下完成TCP客户端的掉线重连实例。 掉线重连需要使用心跳包发送测试网络的状态,进而进入重连循环线程。 前面实例完成的功能: 客户端与服务器连接,实现实时刷新状态。 客户端接收服务器的数据。 客户端发送给服务器的数据。 客…

初识Vue.js开发

一、Vue在前端重要性 1.认识vue Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式 JavaScript框架。 全称是Vue.js或者Vuejs;它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型&#xff1b…

【DevOps】Jenkins Extended E-mail 邮件模板添加自定义变量

文章目录 1、配置Jenkins邮箱2、配置告警模板1、配置Jenkins邮箱 略 2、配置告警模板 自定义变量:DYSK_PYTEST_STATUS // Uses Declarative syntax to run commands inside a container. pipeline {agent {kubernetes {cloud "kubernetes" //选择名字是kuberne…

【算法】选择最佳路线(超级源点)

题目 有一天,琪琪想乘坐公交车去拜访她的一位朋友。 由于琪琪非常容易晕车,所以她想尽快到达朋友家。 现在给定你一张城市交通路线图,上面包含城市的公交站台以及公交线路的具体分布。 已知城市中共包含 n 个车站(编号1~n&…

数据仓库简介

一、数仓概念 数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务…

如何使用固定公网地址访问多个本地Nginx服务搭建的网站

文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 本文主要介绍如何在Windows系统对Nginx进行配置,并结合cpolar内网穿透工具实现固定公网地址远程访问多个本地站…

OpenMP和MPI环境配置

目录 OpenMP和MPI环境配置OpenMP环境配置MPI环境配置(Windows)MPI环境配置(Ubuntu) 参考资料 OpenMP和MPI环境配置 OpenMP环境配置 首先创建项目,选择C 控制台应用。 选择项目,属性。 在C/C —— 语言中&…

Raspbian安装云台

Raspbian安装云台 1. 源由2. 选型3. 组装4. 调试4.1 python3-print问题4.2 python函数入参类型错误4.3 缺少mjpg-streamer可执行文件4.4 缺失编译头文件和库4.5 python库缺失4.6 图像无法显示,但libcamera-jpeg测试正常4.7 异常IOCTL报错4.8 Git问题 5. 效果5.1 WEB…