python使用tkinter加载rtsp视频流

news2024/9/23 1:35:02

简介

  最近有个需求,需要开发个桌面应用工具,可是实时显示rstp视频,于是想到了用python自带的tkinter 来开发,最后打包成exe应用。

import cv2
import random
import threading
from tkinter import *
from PIL import Image, ImageTk


def center_window(root):
    root.title('')
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    x = (screen_width / 2) - (width / 2)
    y = (screen_height / 2) - (height / 2)
    root.geometry('%dx%d+%d+%d' % (width, height, x, y))


# 获取RTSP流并显示实时画面
def get_rtsp_stream():
    cap = cv2.VideoCapture("rtsp://admin:a12345678@192.168.1.3:554")
    while True:
        ret, frame = cap.read()
        frame = cv2.resize(frame, (int(width * 0.5), int(height * 0.4)))
        if not ret:
            break
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        canvas.create_image(0, 0, anchor=NW, image=imgtk)
        canvas.image = imgtk
    cap.release()


# 显示图片
def show_image():
    cap = cv2.VideoCapture("rtsp://admin:123456@192.168.1.1:554")
    ret, frame = cap.read()
    frame = cv2.resize(frame, (int(width * 0.5), int(height * 0.4)))
    cv2.imwrite("image.jpg",frame)
    cap.release()
    img = Image.open("image.jpg")
    imgtk = ImageTk.PhotoImage(image=img)
    image_panel.imgtk = imgtk
    image_panel.config(image=imgtk,anchor=NW)

    random_number = random.choice([-0.15, 0.15])
    final_result = lgm_text + random_number
    if final_result < 0:
        final_result = 0.0
    if final_result > 5:
        final_result = 5.0
    lgm_label.config(text=final_result)


def on_click(event):
    global lgm_text
    lgm_text = event.widget["text"]


#tkinter 清空frame
def clear_frame(frame):
    for child in frame.winfo_children():
        child.destroy()

def on_mouse_enter(event):
    step = 0
    for i in [0.0,0.75,1.0,1.25,1.5,1.75,2.0,3.0,4.0,5.0]:
        button = Button(frame, text=i, font=("", 12))
        button.place(relx=0.1, rely=0.08+round(step, 2), relheight=0.08, relwidth=0.2)
        button.bind("<Button-1>", lambda e: on_click(e))
        step += 0.08


def on_mouse_leave(event):
    clear_frame(frame)


if __name__ == '__main__':
    lgm_text = 0.0
    root = Tk()
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    width = int(screen_width*0.67)
    height = int(screen_height*0.8)

    center_window(root)

    # 实时画面面板
    canvas = Canvas(root)
    canvas.place(relx=0.05, rely=0.05, relheight=0.4, relwidth=0.5)

    # 图片面板
    image_panel = Label(root)
    image_panel.place(relx=0.05, rely=0.55, relheight=0.4, relwidth=0.5)

    # 抓拍按钮
    button = Button(root, text='抓拍按钮',font=("", 18),command=lambda: threading.Thread(target=show_image).start())
    button.place(relx=0.6, rely=0.3, relheight=0.05, relwidth=0.15)

    # 林格曼值
    lgm_label = Label(root, text="",font=("", 20), fg="red")
    lgm_label.place(relx=0.6, rely=0.75, relheight=0.05, relwidth=0.15)

    # 林格曼等级面板
    frame = Frame(root)
    frame.place(relx=0.8, rely=0.1, relheight=0.7, relwidth=0.5)
    frame.bind('<Enter>', on_mouse_enter)
    frame.bind('<Leave>', on_mouse_leave)

    thread = threading.Thread(target=get_rtsp_stream)
    thread.daemon = True
    thread.start()

    root.mainloop()

在这里插入图片描述

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

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

相关文章

group 与查询字段

需求 每周周一&#xff0c;统计菜单在过去一周&#xff0c;点击次数&#xff0c;和点击人数&#xff08;同一个人访问多次按一次计算&#xff09; 表及数据 日志表 CREATE TABLE t_data_log ( id varchar(50) NOT NULL COMMENT 主键id, operation_object varchar(500) DE…

麦克风领夹式的哪个牌子最好,一文告诉你无线领夹麦克风哪款好

​在选择无线麦克风时&#xff0c;多样化的市场需求和不断进步的技术&#xff0c;使得从专业级到入门级的各类产品应运而生&#xff0c;满足不同场景和预算的需求。为了让消费者在众多选择中找到适合自己的无线麦克风&#xff0c;我们基于市场销量和用户口碑&#xff0c;整理出…

Java中的Set系列集合超详解

Set List是有序集合的根接口&#xff0c;Set是无序集合的根接口&#xff0c;无序也就意味着元素不重复。更严格地说&#xff0c;Set集合不包含一对元素e1和e2 &#xff0c;使得e1.equals(e2) &#xff0c;并且最多一个空元素。   使用Set存储的特点与List相反&#xff1a;元素…

界面组件Kendo UI for React 2024 Q2亮点 - 生成式AI集成、设计系统增强

随着最新的2024年第二季度发布&#xff0c;Kendo UI for React为应用程序开发设定了标准&#xff0c;包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示&#xff0c;从设计到代码的生产力增强、可访问性…

219.贪心算法:柠檬水找零(力扣)

代码解决 class Solution { public:bool lemonadeChange(vector<int>& bills) {int num50, num100; // 初始化5美元和10美元的计数器for(int i0; i < bills.size(); i) // 遍历所有账单{if(bills[i]5) // 如果账单是5美元{num5; // 增加5美元的计数continue; // …

永磁同步电机谐波抑制算法(7)——基于自适应陷波(adaptive notch filter,ANF)的精确谐波电流抑制策略

1.前言 1.1经典谐波抑制策略存在的问题 在之前的谐波抑制专题中&#xff0c;主要介绍了两种谐波抑制策略——基于多同步旋转坐标系的谐波抑制策略以及基于比例积分谐振PIR调节器的谐波抑制策略&#xff0c;同时还介绍了这两种策略的改进办法&#xff0c;进而使得这两种策略在…

视频号矩阵系统源码,实现AI自动生成文案和自动回复私信评论,支持多个短视频平台

在当今短视频蓬勃发展的时代&#xff0c;视频号矩阵系统源码成为了自媒体人争相探索的宝藏。这一强大的技术工具不仅能帮助我们高效管理多个短视频平台&#xff0c;更能通过AI智能生成文案和自动回复私信评论&#xff0c;为自媒体运营带来前所未有的便利与效率。 一、视频号矩…

【算法】接雨水

难度&#xff1a;困难 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例&#xff1a; 示例1 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是…

开放式耳机哪款好一点?开放式耳机科普五款推荐!

“选择开放式耳机真的太难了” “哥&#xff0c;怎么才能选到心仪的开放式耳机啊” 这种评论总是会出现后台或者现实的朋友也会问起来&#xff0c;所以作为耳机测评的博主&#xff0c;在这里给大家科普一下到底一款好用的开放式耳机到底怎么选&#xff0c;这篇文章我花了三天…

【RHCE】基于密钥身份认证

1.在本主机点击【⼯具】按钮打开【⽤⼾密钥管理者】选项 在该⻚⾯单击【⽣成】按钮来创建密钥对 在向导⻚⾯&#xff0c;选择【密钥类型】和【密钥⻓度】&#xff0c;这⾥保持默认。单击【下⼀步】按钮。 跳转到以下⻚⾯&#xff0c;表⽰密钥对已经创建完成。单击【下⼀步】给…

Nessus相关

tenable 1 安装nessus scanner 1 )安装nessus scanner: 方法一 curl -H X-Key: xxxxx https://cloud.tenable.com/install/scanner?namescanner-name&groupsscanner-group | bash方法二&#xff1a; **# for ubuntu, its https://www.tenable.com/downloads/api/v1/pu…

面试篇-Java-3+类加载+JVM 内存划分

文章目录 前言一、你知道类的加载过程吗1.1 你都知道哪些类型的类加载器1.2 你知道双亲委派机制吗1.3 你来说类加载都有哪些步骤1.3.1 加载&#xff1a;1.3.2 连接&#xff1a;1.3.1.2 验证1.3.1.3 准备1.3.1.4 解析 1.3.3 初始化 二、你知道JVM 中内存的分配吗2.1 你知道类加载…

通用图形处理器设计GPGPU基础与架构(二)

一、前言 本系列旨在介绍通用图形处理器设计GPGPU的基础与架构&#xff0c;因此在介绍GPGPU具体架构之前&#xff0c;需要了解GPGPU的编程模型&#xff0c;了解软件层面是怎么做到并行的&#xff0c;硬件层面又要怎么配合软件&#xff0c;乃至定出合适的架构来实现软硬件协同。…

如何修复d3dx9_43.dll文件丢失问题,实测有效的几种方法分享

在日常工作生活中&#xff0c;计算机可能会出现提示“d3dx9_43.dll文件丢失”的情况&#xff0c;面对这种情况&#xff0c;您该如何应对呢&#xff1f;这种情况在计算机使用过程中是比较常见的&#xff0c;对于经常使用计算机的人来说&#xff0c;难免会遇到这种情况。今天&…

Milvus 核心设计(1) ---- 数据一致性的等级及使用场景

目录 背景 Milvus的数据一致性 设置数据一致性等级 等级类型 PACELC定理 level 详细解释 Strong Bounded staleness Session Eventually 总结 背景 分布式上的可扩展性是个比较重要的concept。Chroma 核心之前写过了,他的最大优势在于轻量级且好用。Milvus相对Ch…

PHP企业工商年报大师微信小程序系统源码

&#x1f31f;轻松搞定年报难题&#xff01;&#x1f4bc; &#x1f680;【一键直达&#xff0c;年报不再繁琐】 还在为每年的企业工商年报而头疼吗&#xff1f;繁琐的表格、复杂的流程&#xff0c;让人望而却步&#xff1f;现在有了“企业工商年报大师”微信小程序&#xff…

彻底解决找不到msvcr120.dll,无法继续执行代码的问题(最新方法)

在使用电脑过程中经常会遇到各种问题&#xff0c;其中msvcr120.dll丢失或找不到msvcr120.dll问题就是常见之一&#xff0c;那么遇到msvcr120.dll丢失要怎么解决&#xff1f;msvcr120.dll又是什么为什么会丢失&#xff1f;今天给大家介绍一下msvcr120.dll文件跟msvcr120.dll丢失…

189. 轮转数组 --- 多种方式解题

直接开新数组&#xff0c;暴力遍历&#xff0c;新位置(原位置k)%nums.length class Solution {public void rotate(int[] nums, int k) {int[] ans new int[nums.length];for (int i 0; i < nums.length; i) {int pos (i k) % nums.length;ans[pos] nums[i];}for (int…

Ubuntu系统上安装Apache和WordPress

** 第一步跟新系统包 ** 首先跟新系统包 sudo apt update sudo apt upgrade第二步下载安装apache sudo apt install apache2 ##查看apache的状态是否启动成功 sudo systemctl status apache2 ##查看服务器的ip地址 sudo ip a通过ip地址进行访问apache页面 第三步下载安装…

常见条件控制算法流程图

内容讲解&#xff1a;流程控制[if…else…(if…elif…else…),while,for] 常见条件控制算法流程图高清图