猫狗识别—视频识别

猫狗识别—视频识别

  • 1. 导入所需的库:
  • 2. 创建Tkinter主窗口并设置标题:
  • 3. 设置窗口的宽度和高度:
  • 4. 创建一个Canvas,它将用于显示视频帧:
  • 5. 初始化一个视频流变量cap,用于存储OpenCV的视频捕获对象:
  • 6. 定义一个函数update_frame,用于更新Canvas上的视频帧。函数实现将在后面解释:
  • 7. 定义一个函数update_frame,用于更新Canvas上的视频帧。函数实现将在后面解释:
  • 8. 定义一个函数close,用于退出程序并关闭视频流。函数实现将在后面解释:
  • 9. 创建两个按钮,一个用于选择视频文件,另一个用于退出程序。按钮的图片和位置在这里设置:
  • 10. 启动Tkinter的事件循环,这将显示窗口并开始处理用户事件:
  • 11. 完整代码+运行结果:
    • 完整代码:
    • 运行结果:

1. 导入所需的库:

cv2用于视频捕获和图像处理,tkinter用于创建GUI,filedialog用于打开文件对话框,Image和ImageTk用于处理图像,threading用于创建新线程以更新视频帧,subprocess用于启动其他Python脚本。

import cv2
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import threading
import subprocess

2. 创建Tkinter主窗口并设置标题:

# 初始化窗口
root = tk.Tk()
root.title("视频识别猫狗")

3. 设置窗口的宽度和高度:

# 设置窗口大小
window_width = 800
window_height = 600
root.geometry(f"{window_width}x{window_height}")

4. 创建一个Canvas,它将用于显示视频帧:

# 创建一个Canvas用于显示视频
canvas = tk.Canvas(root, width=window_width, height=window_height, bg="white")
canvas.pack()

5. 初始化一个视频流变量cap,用于存储OpenCV的视频捕获对象:

# 初始化视频流
cap = None

6. 定义一个函数update_frame,用于更新Canvas上的视频帧。函数实现将在后面解释:

# 更新视频帧的函数
def update_frame():
    global cap
    while cap is not None and cap.isOpened():
        ret, frame = cap.read()
        if ret:
            # 转换为灰度图像
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

            # 加载Haar cascade文件
            cat_cascade = cv2.CascadeClassifier('haarcascade_frontalcatface.xml')
            dog_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

            # 检测猫和狗
            cats = cat_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
            dogs = dog_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

            # 在检测到的猫和狗周围画矩形框
            for (x, y, w, h) in cats:
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
            for (x, y, w, h) in dogs:
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

            # 转换为Tkinter兼容的格式并显示
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            image = Image.fromarray(frame)
            image = ImageTk.PhotoImage(image)

            # 自动调整Canvas大小以适应视频帧
            canvas.config(width=image.width(), height=image.height())
            canvas.create_image(0, 0, anchor=tk.NW, image=image)
            root.update_idletasks()
            root.after(10, update_frame)  # 每10毫秒更新一次帧
        else:
            cap.release()
            break

7. 定义一个函数update_frame,用于更新Canvas上的视频帧。函数实现将在后面解释:

# 选择视频的函数
def select_video():
    global cap
    file_path = filedialog.askopenfilename(initialdir="data/视频识别数据")
    if file_path:
        cap = cv2.VideoCapture(file_path)
        threading.Thread(target=update_frame).start()

8. 定义一个函数close,用于退出程序并关闭视频流。函数实现将在后面解释:

# 退出程序的函数
def close():
    # 停止视频流
    subprocess.Popen(["python", "主页面.py"])
    if cap is not None and cap.isOpened():
        cap.release()
    # 销毁窗口
    root.destroy()
    # 启动主页面程序

9. 创建两个按钮,一个用于选择视频文件,另一个用于退出程序。按钮的图片和位置在这里设置:

# 创建按钮
image = Image.open("选择视频.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(root, image=photo2, width=162, height=100, command=select_video)
bt1.place(x=150, y=470)

image = Image.open("退出.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt1 = tk.Button(root, image=photo3, width=162, height=100, command=close)
bt1.place(x=500, y=470)

10. 启动Tkinter的事件循环,这将显示窗口并开始处理用户事件:

root.mainloop()

11. 完整代码+运行结果:

完整代码:

import cv2
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import threading
import subprocess

# 初始化窗口
root = tk.Tk()
root.title("视频识别猫狗")

# 设置窗口大小
window_width = 800
window_height = 600
root.geometry(f"{window_width}x{window_height}")

# 创建一个Canvas用于显示视频
canvas = tk.Canvas(root, width=window_width, height=window_height, bg="white")
canvas.pack()

# 初始化视频流
cap = None

# 更新视频帧的函数
def update_frame():
    global cap
    while cap is not None and cap.isOpened():
        ret, frame = cap.read()
        if ret:
            # 转换为灰度图像
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

            # 加载Haar cascade文件
            cat_cascade = cv2.CascadeClassifier('haarcascade_frontalcatface.xml')
            dog_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

            # 检测猫和狗
            cats = cat_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
            dogs = dog_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

            # 在检测到的猫和狗周围画矩形框
            for (x, y, w, h) in cats:
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
            for (x, y, w, h) in dogs:
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

            # 转换为Tkinter兼容的格式并显示
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            image = Image.fromarray(frame)
            image = ImageTk.PhotoImage(image)

            # 自动调整Canvas大小以适应视频帧
            canvas.config(width=image.width(), height=image.height())
            canvas.create_image(0, 0, anchor=tk.NW, image=image)
            root.update_idletasks()
            root.after(10, update_frame)  # 每10毫秒更新一次帧
        else:
            cap.release()
            break

# 选择视频的函数
def select_video():
    global cap
    file_path = filedialog.askopenfilename(initialdir="data/视频识别数据")
    if file_path:
        cap = cv2.VideoCapture(file_path)
        threading.Thread(target=update_frame).start()

# 退出程序的函数
def close():
    # 停止视频流
    subprocess.Popen(["python", "主页面.py"])
    if cap is not None and cap.isOpened():
        cap.release()
    # 销毁窗口
    root.destroy()
    # 启动主页面程序

# 创建按钮
image = Image.open("选择视频.gif")  # 加载一张图片
photo2 = ImageTk.PhotoImage(image)
bt1 = tk.Button(root, image=photo2, width=162, height=100, command=select_video)
bt1.place(x=150, y=470)

image = Image.open("退出.gif")  # 加载一张图片
photo3 = ImageTk.PhotoImage(image)
bt1 = tk.Button(root, image=photo3, width=162, height=100, command=close)
bt1.place(x=500, y=470)

root.mainloop()

运行结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

期末考试的成绩怎么发?

随着学期末的临近,我们又迎来了向家长通报学生成绩的关键时刻。下面是一份成绩群发的全新指南,让我们一起高效而温馨地完成这项任务! 1.选择沟通渠道: - 邮件与短信各有优势。邮件更适合提供详尽的成绩分析和评语,而短…

某同盾验证码

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly9zZWMueGlhb2R1bi5jb20vb25saW5lRXhwZXJpZW5jZS9zbGlkaW5nUHV6emxl 1. 先整体分析一下接…

计算机组成原理 | 数据的表示、运算和校验(4)基本运算方法

补码加减(运算与控制) (-Y)补 [Y补]变补,这个要好好理解 (-Y)补:先将Y的符号位置反,在求-Y的补码(数字为变反加1) [Y补]变补:先求Y的补码(数字为变反加1)&…

shell的正则表达------awk

一、awk:按行取列 1.awk原理:根据指令信息,逐行的读取文本内容,然后按照条件进行格式化输出。 2.awk默认分隔符:空格、tab键,把多个空格自动压缩成一个。 3.awk的选项: awk ‘操作符 {动作}’…

微服务、多租户、单点登录、国产化形成的开源Java框架!

一、项目简介 JVS是软开企服构建的一站式数字化的开源框架,支持对接多种账户体系,支持多租户、支持Auth2、统一登录、单点登录等,支持原生开发、低代码/零代码开发应用。 二、框架核心功能 控制台(首页):采用配置化的方式 用户…

Redis数据库(一):Redis数据库介绍与安装

Redis是一种高性能的开源内存数据库,支持多种数据结构(如字符串、列表、集合等),具有快速的读写速度。它提供持久化、主从复制、高可用性和分布式部署等功能,适用于缓存、实时分析、消息队列等应用场景。Redis使用简单…

A股羊群效应CSSD CSAD数据与Stata代码数据(2000-2023)

数据来源 参考马丽老师(2016)的做法,股价数据来源于东方财富网,采用上证180指数及构成上证180指数样本股日收盘价数据作为样本。上证180指数自2002年7月1日起正式发布,其样本股是在所有 A 股股票中抽取最具市场代表性…

什么是绩效评价?绩效考核的五个标准包括哪些?

什么是绩效评价?绩效评价是指运用一定的评价方法、量化指标及评价标准,对中央部门为实现其职能所确定的绩效目标的实现程度,及为实现这一目标所安排预算的执行结果所进行的综合性评价。   绩效考核的五个标准有: 1、考核标准设置…

记一下 Stream 流操作

Java Stream流 创建流 Collection.stream() / Collection.parallelStream()&#xff1a;从集合生成流&#xff0c;后者为并行流。 List<String> list new ArrayList<>(); Stream<String> stream list.stream(); //获取一个顺序流 Stream<String> …

深度学习 --- stanford cs231学习笔记五(训练神经网络的几个重要组成部分之三,权重矩阵的初始化)

权重矩阵的初始化 3&#xff0c;权重矩阵的初始化 深度学习所学习的重点就是要根据损失函数训练权重矩阵中的系数。即便如此&#xff0c;权重函数也不能为空&#xff0c;总是需要初始化为某个值。 3&#xff0c;1 全都初始化为同一个常数可以吗&#xff1f; 首先要简单回顾一下…

【总线】AXI4第五课时:信号描述

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

保姆级 | Windows 复古风格终端样式设置

0x00 前言 前段时间有朋友询问我 Windows 终端的样式是如何设置的&#xff0c;我也进行了一些简单的回复。在之前的 Windows 11 版本中&#xff0c;系统提供了一个界面按钮&#xff0c;可以直接将终端样式设置为复古风格。然而&#xff0c;系统更新之后&#xff0c;这个按钮好像…

【UML用户指南】-22-对高级行为建模-事件和信号

目录 1、概述 2、事件分类 2.1、信号 2.2、调用事件 2.3、时间事件和变化事件 2.4、发送和接收事件 3、常用建模技术 3.1、对信号族建模 3.1.1、建立过程 3.2、对异常建模 在状态机语境中&#xff0c;使用事件对能够触发状态转移的激励建模。事件包括信号、调用、时间…

go语言day03

目录 一、 go语言的数据类型&#xff1a; 二、声明赋值的简写形式&#xff1a; ":" 1&#xff09;重复使用的编译错误 2&#xff09;在全局变量中使用 : 会报编译错误 三、变量规则&#xff1a; 0&#xff09;变量的命名规则&#xff1a; 1&#xff09;创建的局部…

Excel 宏录制与VBA编程 —— 12、文本字符串类型相关(附示例)

字符串分割&#xff0c;文末示例&#xff08;文末代码3附有源码&#xff09; 代码1 - 基础字符串 代码2 - 字符串拆分 代码3 - 字符串分割 Option ExplicitSub WorkbooksClear()Dim DataRange As RangeSet DataRange Range("C2:E12")DataRange.Clear End SubSub Wo…

PS添加物体阴影

一、选择背景&#xff0c;确保物体和北京分割出图层 二、右键单击物体图层&#xff0c;点击混合选项&#xff0c;点击投影 三、调整参数&#xff0c;可以看效果决定(距离是高度&#xff0c;扩展是浓度&#xff0c;大小是模糊程度)&#xff0c;保存即可

PhotoShop自动生成号码牌文件

1、说明 设计卡牌的时候&#xff0c;遇到自动生成编号&#xff0c;从01500到-02500&#xff0c;一个一个的手写&#xff0c;在存储保存成psd格式的文件&#xff0c;会很耗时。 下面将介绍如何使用ps自动生成psd格式的文件 2、使用excle生成数字 从01500到-02500 第一步&…

数据挖掘常见算法(关联)

Apriori算法 Apriori算法基于频繁项集性质的先验知识&#xff0c;使用由下至上逐层搜索的迭代方法&#xff0c;即从频繁1项集开始&#xff0c;采用频繁k项集搜索频繁k1项集&#xff0c;直到不能找到包含更多项的频繁项集为止。 Apriori算法由以下步骤组成&#xff0c;其中的核…

【Python/Pytorch 】-- K-means聚类算法

文章目录 文章目录 00 写在前面01 基于Python版本的K-means代码02 X-means方法03 最小二乘法简单理解04 贝叶斯信息准则 00 写在前面 时间演变聚类算法&#xff1a;将时间演变聚类算法用在去噪上&#xff0c;基本思想是&#xff0c;具有相似信号演化的体素具有相似的模型参数…

连续9年618全渠道第一,入选最受用户关注TOP10,德施曼做对了什么?

近日&#xff0c;智能锁赛道领军品牌德施曼闯入大消费赛道&#xff0c;与宝洁、美的等品牌一起入选今年京东618最受用户关注TOP10品牌。 2024年的618大促已正式落下帷幕&#xff0c;大品牌纷纷交出了这场“年中大考”的答卷&#xff1b;其中高端智能锁领军品牌德施曼也交出了一…