【图像识别】摄像头捕捉运动到静止视频帧(免费源码分享)

news2024/11/15 15:56:25

在这里插入图片描述

【图像识别】摄像头捕捉运动到静止视频帧(免费源码分享)

1. 本文摘要

本文实现了一个OpenCV和PyQT5 结合的摄像头视频捕捉和运动检测线程,实现了一款界面软件用于功能演示。主要使用帧差法实现,摄像头捕捉运动到静止的图片,捕捉到的图片可用于其他,例如:用于目标检测、识别等,主要流程如下:

  1. 初始化摄像头。
  2. 实时读取帧并进行区域检测。
  3. 通过帧差法判断运动。
  4. 使用信号机制将结果图像发送到主界面。

本系统所涉及的源码已打包上传,可放心获取,免费,无套路!!获取方式,点击原文链接,根据提示获取即可。

原文链接:【图像识别】摄像头捕捉运动到静止视频帧(免费源码分享)
在这里插入图片描述

2. 主要流程介绍

对摄像头区域做出限定,主要是我的使用流域是目标检测领域,摄像头视域边缘容易误触发识别
在这里插入图片描述

3. 线程处理代码及逻辑

这个类实现了一个使用 OpenCV 和 PyQt5 结合的摄像头视频捕捉和运动检测线程,主要逻辑分为:

  1. 初始化摄像头。
  2. 实时读取帧并进行区域检测。
  3. 通过帧差法判断运动。
  4. 使用信号机制将结果图像发送到主界面。

3.1 导入库和模块

import cv2
from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
from PyQt5.QtGui import QImage
import time
  • cv2:用于处理摄像头视频流和图像操作的 OpenCV 库。
  • QThread:PyQt5 中的线程类,用于在单独的线程中运行摄像头捕捉逻辑。
  • pyqtSignal:PyQt5 中的信号机制,用于线程之间的通信。定义信号后,可以在程序的其他部分接收信号并处理相关逻辑。
  • QDateTime:PyQt5 中的时间处理类,用于获取当前时间。
  • QImage:PyQt5 中的图像类,用于将 OpenCV 图像转换为 QImage 后显示。
  • time:标准库模块,用于控制循环内的延迟。

3.2 CameraThread 类初始化

class CameraThread(QThread):
    sig_area_detect_result = pyqtSignal(QImage)
    sig_update_frame = pyqtSignal(QImage)

    def __init__(self):
        super(CameraThread, self).__init__()
        self.running = True
        self.first_frame = None
        self.contours_total_count = 0
        self.tmp_moment_1 = 0
        self.tmp_moment_2 = 0
        self.tmp_moment_3 = 0
        self.width_percent = 0.25
        self.height_percent = 0.2

QThread:继承 QThread 类,实现线程逻辑。摄像头操作在一个独立线程中进行,防止阻塞主 GUI 线程。
信号定义:

  • sig_area_detect_result:用于发射检测结果图像的信号。
  • sig_update_frame:用于发射每一帧图像更新信号。
    类属性:
  • self.running:控制线程运行的布尔值。
  • self.first_frame:保存初始帧,用于后续的帧差运算。
  • self.contours_total_count:记录运动物体轮廓的总数。
  • self.tmp_moment_1, tmp_moment_2, tmp_moment_3:用于记录时间戳,控制不同时间段的处理。
  • self.width_percent, self.height_percent:用于定义裁剪图像的比例,缩小检测区域。

3.3 run() 方法 - 线程主逻辑

def run(self):
    cap = cv2.VideoCapture(0)  # 打开摄像头
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1600)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1200)

cv2.VideoCapture(0):打开摄像头,并将其分配给 cap 对象。
set():设置摄像头的分辨率为 1600x1200。

while self.running:
    ret, frame = cap.read()
    if ret:
        contours_count = self.area_detect(frame)
        if contours_count > 0:
            # 运动中,总数++
            self.contours_total_count += 1
            self.tmp_moment_1 = QDateTime.currentMSecsSinceEpoch()
            if self.contours_total_count >= 3:
                self.tmp_moment_2 = QDateTime.currentMSecsSinceEpoch()
        else:
            # 静止状态
            current_time = QDateTime.currentMSecsSinceEpoch()
            ntmp_moment = current_time - self.tmp_moment_2
            if 210 < ntmp_moment < 1000:
                if current_time - self.tmp_moment_3 > 2000:
                    h, w, c = frame.shape
                    b = c * w
                    r_img = QImage(frame.data, w, h, b, QImage.Format_BGR888)
                    self.sig_area_detect_result.emit(r_img)
                    self.tmp_moment_3 = current_time
            if current_time - self.tmp_moment_1 > 300:
                self.contours_total_count = 0
        # 将图像传递到主界面显示
        height, width, channel = frame.shape
        bytes_per_line = channel * width
        q_img = QImage(frame.data, width, height, bytes_per_line, QImage.Format_BGR888)
        self.sig_update_frame.emit(q_img)
    time.sleep(0.01)

cap.read():从摄像头读取当前帧图像。ret 为布尔值,表示读取是否成功,frame 是读取的图像数据。
area_detect():调用 area_detect() 方法进行运动检测,返回轮廓计数 contours_count。
运动检测逻辑:

  • 如果有运动检测(contours_count > 0),更新 self.contours_total_count 和时间戳。
  • 如果超过 3 个连续帧有运动,则记录时间戳 tmp_moment_2。
  • 如果静止(contours_count == 0),计算静止时间差,并在静止时间合适时(210ms 到 1000ms)发送检测结果图像信号 sig_area_detect_result。
    frame.shape:获取图像的高度、宽度和通道数。
    QImage():将 frame 转换为 QImage,方便在 PyQt5 界面中显示。
    sig_update_frame.emit():发射更新图像信号,供主界面使用。
    time.sleep(0.01):线程暂停 10 毫秒,避免过高的 CPU 占用。
    cap.release():释放摄像头资源。

3.4 area_detect() 方法 - 运动检测

def area_detect(self, frame):
    # 左右各裁剪四分之一, 高裁剪五分之一,存入裁剪图像
    height, width = frame.shape[:2]
    cropped_frame = frame[int(height*self.height_percent):height, 
                          int(width*self.width_percent):int(width*(1-self.width_percent))]
    
    # 调整大小,灰度化和高斯模糊
    resized_frame = cv2.resize(cropped_frame, (width // 3, height // 3))
    gray_frame = cv2.cvtColor(resized_frame, cv2.COLOR_BGR2GRAY)
    blurred_frame = cv2.GaussianBlur(gray_frame, (21, 21), 0)

    if self.first_frame is None:
        self.first_frame = blurred_frame
        return 0

    # 计算当前帧与初始帧的差异
    frame_delta = cv2.absdiff(self.first_frame, blurred_frame)
    _, thresh = cv2.threshold(frame_delta, 50, 255, cv2.THRESH_BINARY)
    thresh = cv2.dilate(thresh, None, iterations=2)

    # 查找轮廓
    contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    self.first_frame = blurred_frame
    return len(contours)

frame.shape:获取图像的高度和宽度。
裁剪图像:通过 self.height_percent 和 self.width_percent 计算裁剪区域,仅检测特定区域的运动。
灰度处理与模糊:裁剪图像后,缩小尺寸,转换为灰度图,并应用高斯模糊以减少噪声。
first_frame:如果是第一次运行,记录当前帧作为初始帧,用于后续检测。
帧差法:计算当前帧与初始帧的差异 frame_delta,并通过阈值分割获取二值化图像。
轮廓检测:使用 cv2.findContours() 查找轮廓,返回轮廓数量。

4. 主界面逻辑

4.1 打开摄像头启动线程绑定信号槽

def btnOpenCamera(self):
    if self.bOpenCamera is True:
        self.LogShow('摄像头已启动!')
        return
    
    self.LogShow('线程正在启动摄像头, 请等待画面......')
    # 创建摄像头线程
    self.camera_thread = CameraThread()
    self.camera_thread.sig_update_frame.connect(self.update_image)
    self.camera_thread.sig_area_detect_result.connect(self.handle_detect_result)
    self.camera_thread.start()
    self.bOpenCamera = True

4.2 获取视频帧刷新界面及刷新检测结果帧

def update_image(self, image):
    pixmap = QPixmap.fromImage(image)
    self.ui.ImageShow.setPixmap(pixmap)

def handle_detect_result(self, image):
    pixmap = QPixmap.fromImage(image)
    self.ui.labelImgResult.setPixmap(pixmap)
    self.nCount += 1
    self.LogShow(f'检测摄像头画面由运动到静止 {self.nCount}')

往期文章回顾

【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】【深度学习】YOLOV8数据标注及模型训练方法整体流程介绍及演示
【深度学习】行人跌倒行为检测软件系统【深度学习】火灾检测软件系统
【深度学习】吸烟行为检测软件系统【深度学习】数竹签演示软件系统
【深度学习】菜品目标检测软件系统QT5集成FTP实现文件及文件夹的下载
QT集成开源日志库示例python源码加密之Cython方案简单示例
【python源码加密】Cython针对python工程多层级目录处理办法http服务网络请求如何确保数据安全(含python示例源码)
http请求数据传输时确保完整性和保密性方案(含源码)QT集成百度在线地图JS API实现交互及特定效果
【qt小游戏】小老鼠闯迷宫小游戏(附源码)【qt小系统】传感器云平台3D散点图(附源码)
【qt小系统】通过qt折线图实现论文内容-快餐店排队效能分析【qt小系统】使用qt实现透明的3D魔方效果
【qt小系统】qt对sqlite数据库文件设置访问密码并以绑定QT表格视图的形式实现与数据库交互示例【图像识别】摄像头捕捉运动到静止视频帧(免费源码分享)

原文地址:【图像识别】摄像头捕捉运动到静止视频帧(免费源码分享)

结束语

文中源码文件【获取方式】:点击原文根据提示获取,免费,无套路,关注即可!!!

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

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

相关文章

JavaScript高级——变量提升和函数提升

1、变量声明提升 —— 通过 var 定义&#xff08;声明&#xff09;的变量&#xff0c;在定义语句之前就可以访问到 —— 值&#xff1a;undefined 2、函数声明提升 —— 通过 function 声明的函数&#xff0c;在之前就可以直接调用 —— 值&#xff1a;函数定义&#xff0…

在 Mac 上安装虚拟机怎么样,安装虚拟机与直接安装 Windows 系统有区别吗?

随着跨系统操作的不断发展&#xff0c;虚拟机技术在生产力领域扮演着越来越重要的角色。Mac作为一款主流的操作系统&#xff0c;也有着运行虚拟机的能力。接下来给大家介绍Mac装虚拟机好不好&#xff0c;Mac装虚拟机和装Windows系统一样吗的具体内容。 Mac装虚拟机好不好 Mac…

java程序员入行科目一之CRUD轻松入门教程(四)

三层架构 所谓的三层&#xff1a; DAO层 也可以叫做Mapper或者是Repository层&#xff0c;名字无所谓&#xff0c;但是要清楚这层就是专门和数据库做交互的&#xff0c;一般指的是关系型数据库 Service层 数据的加工处理&#xff0c;调动DAO层去完成一些具体的业务实现&#xf…

【浅谈】单片机基本概念

这里写目录标题 一 引言二 存储器1 ROM&#xff08;read only memory&#xff09;2 RAM (random access memory)3 累加器&#xff08;ACC : accumulator&#xff09; 三 I/O口四 堆栈五 定时/计数器六 中断1、一些中断词汇&#xff1a;2 中断的响应过程&#xff1a;3 作用&…

提示词工程与 AI 使用的紧密关系

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;特别是生成式模型&#xff08;如 GPT 系列模型&#xff09;的广泛应用&#xff0c;提示词工程&#xff08;Prompt Engineering&#xff09;成为了 AI 使用中至关重要的环节。提示词工程是指通过精心设计和优化…

踩最深的坑,教会自己出海的前端选型

目录 引言 1. 前端 1.1 Next.js 1.2 Remix 1.3 Nuxt 2. 样式与UI库 2.1 Tailwind CSS 2.2 NextUI 2.3 Framer Motion 2.4 Shadcn/UI 引言 在经历了刻骨铭心的合伙创业经历后&#xff0c;我意识到是时候该独立出海了。 捡起早已深埋在心里的创业想法&#xff0c;开始…

Unity2D游戏入门

1.导入资源 在Assets下新建文件夹 Res&#xff0c;将相关素材拖入其中&#xff08;本文中的素材仅为学习使用&#xff09;。 2.菜单 设置页面大小 选择素材&#xff0c;查看素材大小。 设置游戏视图大小。 调整工作布局方便查看 记得给场景改名为MenuScene&#xff0c;与其他…

HTTPS安全吗?3个理由告诉你HTTPS为什么是安全的!

从保护银行网站到在线购物期间保护数据&#xff0c;HTTPS协议在互联网上随处可见。例如当您访问racent.com时&#xff0c;你会发现你是通过安全加密链接来访问网站的。这种安全链接会触发浏览器的网址栏旁边显示安全挂锁图标。 但HTTPS真的安全吗? 如果你想快速得到答案&…

item_get京东获取商品详情SKU数据接口||关于京东商品采集接口

jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默…

【网络安全】漏洞挖掘:php代码审计

未经许可,不得转载。 文章目录 正文正文 在应用程序中,通过一个 JavaScript 注释发现了一个备份 ZIP 文件。解压后,获取了应用程序的代码,其中包含如下代码片段: 代码首先检查变量 $action 是否等于 convert,如果是,则继续执行。随后对传入的变量 $data 使用 trim() 函…

github高级搜索

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

memcmp函数的使用

目录 1.头文件 2.memcmp函数讲解 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.头文件 memcmp函数的使用需要包括头文件 #include<string.h> 2.memcmp函数讲解 简述…

0基础转行AI产品经理,终于有人说清楚了!

当AI成为趋势&#xff01;越来越多的产品已经或正在高度AI化&#xff0c;这个趋势正如已经完成的产品移动化一样不可阻挡。产品经理要想让自己保值增值&#xff0c;必须积极拥抱AI的大趋势。 . 学习 AI 产品经理可以参考以下书籍&#xff1a; 《人工智能产品经理——AI时代P…

AI绘画入门教程(全网最详细)从零基础入门到精通,看完这一篇就够了!

前言 AI绘画的出现&#xff0c;让越来越多的人可以轻松画出美丽的插画作品。在本篇文章中&#xff0c;我们将会使用AI绘画软件&#xff1a;触站&#xff0c;轻松创建属于自己的作品。从零开始学AI绘画&#xff01; 从零开始学AI绘画关键步骤&#xff1a; 第一步&#xff1a;…

NC 环形链表的约瑟夫问题

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 编号为 1 到 …

助力汽车半导体产业发展,2025 广州国际新能源汽车功率半导体技术展览会与您相约“羊城”广州

助力汽车半导体产业发展&#xff0c;2025 广州国际新能源汽车功率半导体技术展览会与您相约“羊城”广州 随着半导体技术的升级与发展&#xff0c;功率半导体已经成为推动新能源汽车和智能汽车产业升级的关键因素。汽车不再只是单纯的交通工具&#xff0c;而是逐渐演变为一个智…

QT 串口上位机读卡显示

目录 一. QT创建工程 二. 软件更换图标 三. QT打包 一. QT创建工程 文件新建&#xff0c;选择创建一个桌面QT。 重命名RFID,并选择工程保存路径 RFID.pro QT core gui serialport #串行串口greaterThan(QT_MAJOR_VERSION, 4): QT widgetsTARGET RFID TE…

SX_VMware联网_23

利用Nat模式联网&#xff0c;NAT模式&#xff08;Network Address Translation&#xff09;&#xff1a; 在NAT模式下&#xff0c;虚拟机通过主机的网络接口访问外部网络。 虚拟机之间可以相互通信&#xff0c;也可以访问主机网络以及互联网。 虚拟机使用私有IP地址&#xff0c…

健身管理|基于java的健身管理系统小程序(源码+数据库+文档)

健身管理系统|健身管理系统小程序 目录 基于java的健身管理系统小程序 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&…

磁盘内存大小文件树WizTree(找内存分布)

背景 我想要清理C盘&#xff0c;但是不知道那些地方占据内存最多 https://www.diskanalyzer.com/downloadWizTree is the fastest disk space analyzer for Windows. Download the latest version here. Use it to quickly locate and remove space hogs from your hard driv…