猫狗识别—视频识别

news2024/12/23 14:46:16

猫狗识别—视频识别

  • 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()

运行结果:

在这里插入图片描述

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

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

相关文章

Matlab要这样批量读取txt数据!科研效率UpUp第10期

假如我们有多组txt格式的数据: 其数据格式是这样的: 想要批量读取这些数据,并把他们画在一张图上,该怎么操作呢? ​之前有分享load函数的版本,本期进一步分享适用性更强的readtable函数的实现方法​。 首…

工业的物联网在构建弹性供应链系统中的作用

物联网 (IoT) 可以显着提高供应链系统的效率,因为物联网处理设备之间的连接。简而言之,物联网转化为“连接设备”,物联网的这种能力导致了智能系统或环境。物联网将这些设备与传感器和执行器连接起来,这些传感器和执行器收集数据并…

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验8 IPv4地址 — 分类地址

一、实验目的 1.验证分类IP地址的作用; 2.初步了解路由器的功能。 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频,完成对应实验。 三、实验内容 1.构建网络拓扑; 2.修改网络拓扑&…

原创作品—工业软件界面设计作品

在工业4.0时代,界面设计不仅要追求美观,更要以用户体验为核心。通过简化操作流程、优化交互逻辑,降低用户的学习成本,提高使用效率。这样的设计能够为企业数字化转型提供有力支持,增强用户对产品的黏性。 数字化转型的…

云盘高速视觉检测机如何提升螺丝尺寸检测效率?

螺丝,一种用来连接和固定物体的金属件,通常是长有螺纹的金属棒。螺丝有不同种类和尺寸,常见的用途包括组装家具、机械设备和其他结构。连接和固定物体,通过螺丝的螺纹结构,将两个或多个物体牢固地连接在一起。提供调节…

LabVIEW与C#相互调用dll

C#调用LabVIEW创建的dll 我先讲LabVIEW创建自己的.net类库的方法吧,重点是创建,C#调用的步骤,大家可能都很熟悉了。 1、创建LabVIEW项目,并创建一个简单的add.vi,内容就是abc,各个接线端都正确连接就好。 …

一种改进解卷积算法在旋转机械故障诊断中的应用(MATLAB)

轴承振动是随机振动。在不同的时刻,轴承振动值是不尽相同的,不能用一个确定的时间函数来描述。这是由于滚动体除了有绕轴承公转运动以外,还有绕自身轴线的自旋运动,且在轴承运转时,滚动接触表面形貌是不断变化的&#…

大脑网路分析的进展:基于大规模自监督学习的诊断| 文献速递-先进深度学习疾病诊断

Title 题目 BrainMass: Advancing Brain Network Analysis for Diagnosis with Large-scale Self-Supervised Learning 大脑网路分析的进展:基于大规模自监督学习的诊断 01 文献速递介绍 功能性磁共振成像(fMRI)利用血氧水平依赖&#x…

颠覆传统!支持70+三维格式转换,3D模型格式转换在线即可一键处理!

老子云自研AMRT展示框架及三维格式具有广泛兼容性,同时还会用户提供了3D格式在线转换工具,支持实现70三维格式模型的快速处理和转换。 你是不是也遇到过这种情况:做了半天的3D模型图,好不容易弄好了,到最后插入的时候居…

“硝烟下的量子”:以色列为何坚持让量子计算中心落地?

自2023年10月7日新一轮巴以冲突爆发以来,支持巴勒斯坦伊斯兰抵抗运动(哈马斯)的黎巴嫩真主党不时自黎巴嫩南部向以色列北部发动袭击,以军则用空袭和炮击黎南部目标进行报复,双方在以黎边境的冲突持续至今。 冲突走向扑…

炎炎夏日,矿物质水为你防暑补水

炎炎夏日,整座城市如同一个巨大的“烤箱” 人们行走在炙热烈阳中 汗如雨下,口干舌燥 在这样的高温天气中 中暑的风险也随之增加 烈日当头的夏天 该如何预防中暑呢? 或许答案藏在一杯矿物质水中 为什么矿物质水能够预防中暑?…

AlertDialog和Dialog的区别

在安卓开发过程中,Dialog是我们常用的UI组件之一,它主要用来显示提示信息、与用户进行交互等。在Android中,Dialog有很多种类,其中最常见的就是AlertDialog和普通的Dialog。本文将详细介绍这两者之间的区别,并通过示例…

跟《经济学人》学英文:2024年6月22日这期 Think Nvidia looks dear?

Think Nvidia looks dear? American shares could get pricier still Investors are willing to follow whichever narrative paints the rosiest picture 觉得Nvidia看起来很贵?美国股票可能会变得更贵 投资者愿意追随任何一个描绘出最乐观的故事 dear&#x…

VoxEdit 竞赛|为 The Sandbox 土地持有者设计专属奖励资产

邀请大家参与这场精彩的 VoxEdit 竞赛,在元宇宙中发挥你的创造力,并将你的体素技能提升到新的水平! 按此下载 VoxEdit ! https://www.sandbox.game/en/create/vox-edit/ 比赛主题:建筑与古迹 一起潜入建筑和古迹的世…

pytorch库 03 基础知识

文章目录 一、准备工作二、tensorboard的使用1、add_scalar()方法2、add_image()方法 三、transforms的使用1、ToTensor()类2、常见transforms的类 三、torchvision中的数据集使用 官网 https://pytorch.org/ 一、准备工作 ①在pycharm和jupyter上,检查当前系统是…

聚观早报 | 荣耀Magic V Flip开售;亚马逊将升级Alexa

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 6月24日消息 荣耀Magic V Flip开售 亚马逊将升级Alexa HarmonyOS NEXT Beta发布 懂车帝上线独家片场计划 苹果正…

重学java 83.Java注解

As a failure,I met my last sound. —— 24.6.24 一、注解的介绍 1.引用数据类型: 类、数组、接口、枚举、注解 jdk1.5版本的新特性 一个引用数据类型 和类,接口,枚举是同一个层次的 引用数据类型:类、数组、接口、枚举、注解 2.作用: ① 说明:对代码进行说明,生…

怎么在大模型之上构建应用?构建人工智能上层应用的框架——langchain

“langchain,在大模型之上构建应用的脚手架” 在大模型之上构建应用需要很多的步骤,比如文档加载,数据库读取,大模型加载,以及各个环节的连接等。 因此,就有了langchain这个开发框架,它的功能…

【gif制作】Win下视频生成GIF;工具GifCam单色保存,灰度保存,调速,编辑删除帧添加文本

下载地址 https://blog.bahraniapps.com/gifcam/#download https://gifcam.en.softonic.com/ 界面功能 GifCam 简洁、小巧的 gif 录制软件。GifCam就像照相机一样位于所有窗口的顶部,可以移动它并调整其大小录屏所需的区域。 如图:空闲状态下窗口内…

8.项目结构——黑马程序员Java最新AI+若依框架项目

目录 前言一、后端1.ruoyi-admin2.ruoyi-common3.ruoyi-framework4. ruoyi-generator(可删除)5.ruoyi-quartz(可删除)5.ruoyi-system6. ruoyi-ui7.sql8.依赖关系9. 总结 二、前端三、SQL 前言 提示:本篇叙述若依前后端项目结构 一、后端 1…