使用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.mzph.cn/news/648857.shtml

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

相关文章

c# ADODB.Recordset实例调用Fields报错

代码: using System; using System.CodeDom; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ADODB;namespace ConsoleApp1 {internal class Programre{static ADODB.Recordset recordsetInstance…

代码随想录刷题笔记 DAY15 | 翻转二叉树 No.226 | 对称二叉树 No.101

Day 15 01. 翻转二叉树(No. 226) 题目链接 代码随想录题解 1.1 题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9…

GPU无进程但显存占用

在服务器的docker里面使用显卡发现在终端 ctrl c之后&#xff0c;代码会停掉但是GPU资源不会释放。 nvidia-smi里面还看不到PID进程号&#xff0c;有PID号直接kill 就行了 如果想要把GPU上所有程序全都杀掉可以执行下面的命令 fuser -v /dev/nvidia* |awk {for(i1;i<NF;i…

Odoo14 中的小部件列表

们有不同类型的小部件用于不同的目的&#xff0c;帮助我们简化操作。小部件用于使代码变得简单且用户友好&#xff0c;这将有助于软件的编码和编程方面。在 Odoo 14 开发中&#xff0c;我们可以利用不同的小部件&#xff0c;这些小部件可用于编程操作的某些特定方面。这些简化工…

Oracle Linux 9.3 安装图解

风险告知 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演示环境下进行的&#xff0c;演示环境中没有任何有价值的数据&#xff0c;但这并不代表摆在你面前的环境也是如此。生产环境…

微信小程序元素/文字在横向和纵向实现居中对齐、两端对齐、左右对齐、上下对齐

元素对齐往往是新学者的一大困惑点&#xff0c;在此总结常用的各种元素和文字对齐方式以供参考&#xff1a; 初始显示 .wxml <view style"width: 100%;height: 500rpx; background-color: lightgray;"><view style"width: 200rpx;height:100rpx;bac…

2023年NOC大赛(学而思赛道)创意编程Python初中组决赛真题

2023年NOC大赛&#xff08;学而思赛道&#xff09;创意编程Python初中组决赛真题 题目总数&#xff1a;7 总分数&#xff1a;100 编程题 第 1 题 问答题 二进制回文 编程实现: 输入一个正整数&#xff0c;判断它的二进制形式是否是回文数&#xff0c;如果是输出True…

MySQL建表练习

练习题目&#xff1a;通过所提供的E-R图和数据库模型图完成库表的创建&#xff0c;并插入适量的数据.要求必须使用SQL命令进行构建。 已知如下&#xff1a; 1、创建客户信息表&#xff1a; 代码&#xff1a; CREATE DATABASE Bank; //建库CREATE TABLE Userinfo(Cust…

MacBook自带邮箱设置

MacBook自带邮箱设置 邮件—->偏好设置 服务器设置 收件服务器(POP) 用户名: xxxxxxliang 密码: ***** 主机名:mail.xxx.com.cn 自动管理连接设置 勾上 发件服务器(SMTP) 帐户:xxx.com.cn 用户名:xxxxxxliang 密码:**** 主机名:mail.xxx.com.cn 注意: 自动管理连接设置 不…

JAVA获取时间间隔

参考代码&#xff1a; public ActionResult computingTime(RequestParam("startDate") DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") Date startDate,RequestParam("endDate") DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") Da…

蓝桥杯备战——2.矩阵键盘

1.分析原理图 由上图可以看到若J5跳线帽接地&#xff0c;就S4~S7就可以当做四路独立按键&#xff0c;若接到P44&#xff0c;则就是4*4的矩阵键盘。 2.独立按键处理 相对传统的按键延时消抖方案&#xff0c;这里我采用更高效&#xff0c;更经典&#xff0c;更偏向产品级应用的…

Mybatis 简单用例

MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 Java 的 POJOs (Plain Old Java Object…

[Linux基础开发工具---vim]关于vim的介绍、vim如何配置及vim的基本操作方法

一、vim及其三种模式的简单介绍 Vim是一个类似于Vi的文本编辑器&#xff0c;不同的是vim是vi的升级版本&#xff0c;它不仅兼容vi的所有指令&#xff0c;而且还有一些新的特性在里面,如多级撤销、多窗口操作、崩溃后也可以恢复、增加了稳定性、关键字自动补全、上下文自动补全等…

系统架构14 - 软件工程(2)

需求工程 软件需求两大过程三个层次业务需求(business requirement)用户需求(user requirement)功能需求 (functional requirement)非功能需求 概述活动阶段需求获取基本步骤获取方法 需求分析三大模型数据流图数据字典DD 需求定义需求验证需求管理需求基线变更控制过程变更控制…

【一】从零到1设计一个丧葬行业小程序

初步构想 背景&#xff1a;丈母娘家开了一家丧葬行业的门面&#xff0c;每年就过年几天开一下&#xff0c;但是这样也导致每到过年就必须守在门面&#xff0c;无法过一个轻松的年&#xff0c;所以就想做一款小程序&#xff0c;只用于本地乡镇里进行推广。 主营&#xff1a;烟…

基于卡尔曼滤波的平面轨迹优化

文章目录 概要卡尔曼滤波代码主函数代码CMakeLists.txt概要 在进行目标跟踪时,算法实时测量得到的目标平面位置,是具有误差的,连续观测,所形成的轨迹如下图所示,需要对其进行噪声滤除。这篇博客将使用卡尔曼滤波,对轨迹进行优化。 优化的结果为黄色线。 卡尔曼滤波代码…

SQL查询数据库环境(dm8达梦数据库)

SQL查询数据库环境dm8达梦数据库 环境介绍 环境介绍 某些环境没有图形化界面,可以使用sql语句查询达梦数据库环境情况 SELECT 实例名称 数据库选项,INSTANCE_NAME 数据库选项相关参数值 FROM V$INSTANCE UNION ALL SELECT 授权用户,(SELECT AUTHORIZED_CUSTOMER FROM V$LICE…

对话框与多窗体设计 —— 自定义对话框及其调用

3.2 自定义对话框及其调用3.3 Splash与登录窗口 3.2 自定义对话框及其调用 在一个应用程序设计中&#xff0c;为了实现一些特定的功能&#xff0c;必 须设计自定义对话框。自定义对话框的设计一般从 QDialog继承&#xff0c;并且可以采用UI设计器可视化地设计对 话框。对话框的…

vivado DDS学习

实现DDS通常有两种方式&#xff0c;一种是读取ROM存放的正弦/余弦信号的查表法&#xff0c;另一种是用DDS IP核。这篇学习笔记中&#xff0c;我们要讲解说明的是VIVADO DDS IP核的应用。 目前本篇默认Phase Generator and SIN/COS LUT&#xff08;DDS&#xff09;的standard模式…

Python NLP:自然语言入门(Python和Java)

自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09;是一种涉及将计算机与人类语言进行交互的技术。它涉及将自然语言文本转换为计算机可以理解和处理的形式&#xff0c;以实现各种任务&#xff0c;如文本分类、情感分析、机器翻译等。 Python和…