猫狗识别—视频识别

猫狗识别—视频识别

  • 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 capwhile 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 capfile_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 capwhile 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 capfile_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.mzph.cn/web/33318.shtml

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

相关文章

【速速收藏】适用于Linux系统的五个优秀PDF编辑器

PDF (Portable Document Format) 是便携文档格式的缩写,这是一种用于电子共享文档的标准格式,广泛应用于各种文档类型的存储和分发。然而,有时我们可能需要对PDF文档进行更改和编辑。本文将介绍五款在Linux平台上广受欢迎的PDF编辑器。 ​​…

陀螺仪LSM6DSV16X与AI集成(8)----MotionFX库解析空间坐标

陀螺仪LSM6DSV16X与AI集成.8--MotionFX库解析空间坐标 概述视频教学样品申请源码下载开启CRC串口设置开启X-CUBE-MEMS1设置加速度和角速度量程速率选择设置FIFO速率设置FIFO时间戳批处理速率配置过滤链初始化定义MotionFX文件卡尔曼滤波算法主程序执行流程lsm6dsv16x_motion_fx…

【分布式事务】Seata AT实战

目录 Seata 介绍 Seata 术语 Seata AT 模式 介绍 实战(nacos注册中心,db存储) 部署 Seata 实现 RM 实现 TM 可能遇到的问题 1. Seata 部署成功,服务启动成功,全局事务不生效 2. 服务启动报错 can not get …

[java]集合类stream的相关操作

1.对list中的map进行分组 下面例子中&#xff0c;根据高度height属性进行分组 List<Map<String, Float>>originalList new ArrayList<>();originalList.add(new HashMap<String,Float>() {{put("lng", 180.0f);put("lat",90f);…

C++使用Poco库封装一个FTP客户端类

0x00 Poco库中 Poco::Net::FTPClientSession Poco库中FTP客户端类是 Poco::Net::FTPClientSession , 该类的接口比较简单。 上传文件接口&#xff1a; beginUpload() , endUpload() 下载文件接口&#xff1a; beginDownload() , endDownload() 0x01 FTPCli类说明 FTPCli类…

CSS规则——font-face

font-face 什么是font-face&#xff1f; 想要让网页文字千变万化&#xff0c;仅靠font-family还不够&#xff0c;还要借助font-face&#xff08;是一个 CSS 规则&#xff0c;它允许你在网页上使用自定义字体&#xff0c;而不仅仅是用户系统中预装的字体。这意味着你可以通过提…

jemeter基本使用

后端关验签&#xff0c;设置请求头编码和token 配置编码和token

Linux安装minio及mc客户端(包含ARM处理器架构)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

练习实践:ubuntu18.04安装、配置Nginx+PHP环境,两种配置方式,多站点

参考来源&#xff1a; https://help.aliyun.com/document_detail/464753.html https://www.cnblogs.com/laosan007/p/12803287.html https://blog.csdn.net/qq_55364077/article/details/132207083 【安装同版本7.2的php】 需要知道对应php和nginx的安装版本 需要安装php-fpm…

<sa8650>QCX Usecase 使用详解—如何在 QCX 框架中添加新的自定义Usecase/Pipeline

<sa8650>QCX Usecase 使用详解—如何在 QCX 框架中添加新的自定义Usecase/Pipeline 一、前言二、为 Usecase/Pipeline 创建新文件夹三、Create Usecase XML四、为 camxAutoo_Test 管道创建拓扑五、添加Usecase/Pipeline编译六、 使用 Qcarcam_Test 应用程序运行Usecase一、前…

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

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

【高性能计算笔记】

第1章 - 高性能计算介绍 1. 概念&#xff1a; 高性能计算(High performance computing&#xff0c;缩写HPC)&#xff1a; 指通常使用很多处理器&#xff08;作为单个机器的一部分&#xff09;或者某一集群中组织的几台计算机&#xff08;作为单个计算资源操作&#xff09;的…

零门槛用AI,302.AI让人工智能变得简单易用

当下人工智能火爆&#xff0c;提到AI&#xff0c;几乎每个人都能说上几句&#xff0c;但是你真的会使用AI吗&#xff1f; 当涉及到如何实际使用AI时&#xff0c;许多人可能会觉得它太过高深莫测&#xff0c;从而产生一种距离感&#xff0c;不知如何开始。我和大家也一样&#x…

Android性能优化-内存优化

&#xff11;、为什么进行内存优化&#xff08;如果不进行内存优化&#xff09; APP运营内存限制&#xff0c;OOM导致APP崩溃 APP性能&#xff0c;流畅性&#xff0c;响应速度和体验 2、Android内存管理方式: Android系统内存分配与回收方式 APP内存限制机制 切换应用时&…

AGV选型要点及步骤,保证企业选择的AGV小车更实用

AGV AGV小车作为智能化物流仓储不可或缺的工具&#xff0c;在制造业得到了广泛的应用&#xff0c;市场需求呈现出井喷式增长。但是AGV市场还存在着很多问题&#xff0c;制造企业在产品选型时往往缺乏正确的引导。 AGV智能仓储 毫无疑问,我们的自动化物流系统已离不开AGV小车了,…

链在一起Chained Together没中文 超好用的一键汉化工具推荐

《链在一起》一款新的可联机冒险跑酷类游戏&#xff0c;游戏里玩家将与你的同伴被链在一起&#xff0c;然后开始你的旅程&#xff0c;在地狱的深处&#xff0c;任务是通过尽可能高的攀登逃离地狱。 每一次跳跃都需要完美的协调才能攀上平台并逃离灼热&#xff0c;穿越众多世界&…

服务器win10server,python安装paddleocr的踩坑日记

最近由于需要图像文字识别的简单业务&#xff0c;研究了一下&#xff0c;一是用大厂的文字识别api&#xff0c;如百度腾讯等&#xff0c;但这种免费版只有有限的调用次数&#xff0c;如百度只有每月只有1000次调用额度&#xff0c;个人也够用&#xff0c;但由于业务量大&#x…

深入测评:ONLYOFFICE 8.1 桌面编辑器究竟有多强大?

ONLYOFFICE 8.1桌面编辑器 文章目录 ONLYOFFICE 8.1桌面编辑器一、ONLYOFFICE的简介二、ONLYOFFICE 8.1新功能和改进2.1 轻松编辑器 PDF 文件2.2 用幻灯片版式快速修改幻灯片2.3 无缝切换文档编辑、审阅和查看模式2.4 改进从右至左语言的支持 & 新的本地化选项2.5 隐藏“连…

【权威发布】2024年文化、设计与社会科学国际会议(ICCDSS 2024)

2024年文化、设计与社会科学国际会议 2024 International Conference on Culture, Design, and Social Sciences 会议简介 2024年文化、设计与社会科学国际会议旨在为全球范围内的专家学者提供一个交流文化、设计与社会科学研究成果的平台。会议将围绕文化、设计与社会科学的前…

超越AnimateAnyone, 华中科大中科大阿里提出Unimate,可以根据单张图片和姿势指导生成视频。

阿里新发布的UniAnimate&#xff0c;与 AnimateAnyone 非常相似&#xff0c;它可以根据单张图片和姿势指导生成视频。项目核心技术是统一视频扩散模型&#xff0c;通过将参考图像和估计视频内容嵌入到共享特征空间&#xff0c;实现外观和动作的同步。 相关链接 项目&#xff1…