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

在这里插入图片描述

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

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.mfbz.cn/a/875695.html

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

相关文章

朗迪锋亮相2024年中国国际服务贸易交易会

9月12日至14日&#xff0c;2024中国国际服务贸易交易会&#xff08;以下简称“服贸会”&#xff09;在国家会议中心和首钢园区成功举办。本届服贸会由商务部和北京市人民政府共同主办&#xff0c;继续秉承“全球服务 互惠共享”的宗旨&#xff0c;与参展企业一同聚焦“共享智慧…

高性能编程:无锁队列----MsgQueue代码实践

目录 概述 代码结构 1. 头文件解析 (msgqueue.h) 2. 实现文件解析 (msgqueue.c) 核心功能解析 2.1 创建队列 (msgqueue_create) 2.2 放入消息 (msgqueue_put) 2.3 获取消息 (msgqueue_get) 2.4 交换队列 (__msgqueue_swap) 2.5 阻塞与非阻塞模式 2.6 销毁队列 (msgq…

解决mp框架无法更新null值的问题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、解决方法 前言 在使用mp框架过程中可能会遇到需要将某个字段为null的情况 但是mp自带的方法例如update默认是不支持更新null值的 一、解决方法 主要是这两…

分析图形学示例报告

一、实验任务 二、主要功能模块 三、代码 //自定义坐标系模块 CDC* pDC GetDC();//获得设备上下文 CRect rect;//定义矩形 GetClientRect(&rect);//获得矩形客户去大小 pDC->SetMapMode(MM_ANISOTROPIC);//自定义坐标系 pDC->SetWindowExt(rect.Width()/4, rect.He…

windows server2012 配制nginx安装为服务的时候,直接跳要安装.net框架,用自动的安装,直接失败的解决。

1、上一个已成功在安装过程中的图&#xff1a; 2、之前安装过程中错误的图&#xff1a; 3、离线安装解决&#xff1a; 下载.net framework 3.5&#xff0c;然后解压后&#xff0c;选择指定备用源路径&#xff0c;然后选择.net安装包所在目录&#xff1a; 只要指定上面全路径就…

Kubernetes 常用指令2

kubernetes 常用命 令 1. 编写 yaml 文件 2. kubectl create 通过配置文件名或标准输入创建一个集群资源对象&#xff0c;支 持 json 和 yaml 格式的文件 语法&#xff1a; kubectl create -f 文件名 kubectl create deployment 资源名 --image镜像名 kubectl create deplo…

Halcon 深度学习 分类预处理

文章目录 read_dl_dataset_classification 产生一个深度学习数据集算子split_dl_dataset 将样本分为训练、验证和测试子集create_dl_preprocess_param 使用预处理参数创建字典preprocess_dl_dataset 预处理DLDataset中声明的整个数据集write_dict 写入字典文件find_dl_samples …

Java wrapperr打包springboot项目到linux和Windows

Java wrapper打包springboot项目到linux和Windows 1 Java wrapper 说明2 linux的安装步骤2.1 解压 创建目录2.2 复制文件2.3 配置文件2.4 启动 3 windows3.1 配置文件3.2 复制文件3.3 启动 1 Java wrapper 说明 前提&#xff1a; 一定要有Java环境&#xff08;我使用的是jdk1.8…

C和指针:指针

内存和地址 程序视角看内存是一个大的字节数组&#xff0c;每个字节包含8个位&#xff0c;可以存储无符号值0至255,或有符号值-128至127。 多个字节可以合成一个字&#xff0c;许多机器以字为单位存储整数&#xff0c;每个字一般由2个或4个字节组成。 由于它们包含了更多的位&…

油耳用什么掏耳朵比较好?可视挖耳勺推荐平价

掏耳朵是一个轻松又舒服的感觉&#xff0c;很多人就会用棉签和普通耳勺越掏越进&#xff0c;在盲掏的过程中容易弄伤耳膜。所以我们在掏耳时要选好工具。市面上的智能可视挖耳勺&#xff0c;顶端带有摄像头&#xff0c;可以通过清楚的观察到耳道中的情况。但现在市面上关于可视…

在Linux中从视频流截取图片帧(ffmpeg )

Linux依赖说明: 说明: 使用到的 依赖包 1. ffmpegsudo apt update sudo apt-get install ffmpeg2. imagemagick (选装) (检测图像边缘信息推断清晰度,如果是简单截取但个图像帧>用不到<)sudo apt-get install imagemagick备注: 指令及相关参数说明核心指令: (作用: 执…

VSCode好用的插件推荐

1. Chinese 将vscode翻译成简体中文 2. ESLint 自动检查规范 3. Prettier - Code formatter 可以自动调整代码的缩进、换行和空格&#xff0c;确保代码风格统一。通过配置&#xff0c;Prettier可以在保存文件时自动格式化代码 https://juejin.cn/post/74025724757198274…

从 Postgres 到 ClickHouse:数据建模指南

本文字数&#xff1a;7149&#xff1b;估计阅读时间&#xff1a;18 分钟 作者&#xff1a;Sai Srirampur 本文在公众号【ClickHouseInc】首发 上个月&#xff0c;我们收购了专注于 Postgres CDC 的 PeerDB。PeerDB 使得数据从 Postgres 复制到 ClickHouse 变得既快速又简单。Pe…

Docker日志管理之Filebeat+ELK日志管理

所需安装包及镜像 安装步骤 把所需镜像导入到Docker容器 打开/etc/sysctl.conf配置文件&#xff0c;添加参数 打开资源限制配置文件&#xff0c;添加参数 创建一个网络 在根目录下创建一个项目目录 创建Elasticsearch子目录 在项目目录下创建Elasticsearch子目录 将安装Elast…

微生物分类检测系统源码分享

微生物分类检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

突发!OpenAI发布最强模型o1:博士物理92.8分,IOI金牌水平

梦晨 衡宇 发自 凹非寺量子位 | 公众号 QbitAI 参考ChatGPT&#xff1a;点击使用 来了来了&#xff01;刚刚&#xff0c;OpenAI新模型无预警上新&#xff1a; o1系列&#xff0c;可以进行通用复杂推理&#xff0c;每次回答要花费更长时间思考。 在解决博士水平的物理问题时&a…

Notepad++插件:TextFX 去除重复行

目录 一、下载插件 TextFX Characters 二、去重实操 2.1 选中需要去重的文本 2.2 操作插件 2.3 结果展示 2.3.1 点击 Sort lines case sensitive (at column) 2.3.2 点击 Sort lines case insensitive (at column) 一、下载插件 TextFX Characters 点【插件】-【插件管理…

【OpenAPI】Spring3 集成 OpenAPI 生成接口文档

Spring3 集成 OpenAPI 生成接口文档 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 OpenAPI 依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-starter-webmvc-ui --> <dependency><groupI…

如何通过 PhantomJS 模拟用户行为抓取动态网页内容

引言 随着网页技术的不断进步&#xff0c;JavaScript 动态加载内容已成为网站设计的新常态&#xff0c;这对传统的静态网页抓取方法提出了挑战。为了应对这一挑战&#xff0c;PhantomJS 作为一个无头浏览器&#xff0c;能够模拟用户行为并执行 JavaScript&#xff0c;成为了获…

GeoPandas在地理空间数据分析中的应用

GeoPandas是一个开源的Python库&#xff0c;专门用于处理和分析地理空间数据。它建立在Pandas库的基础上&#xff0c;扩展了Pandas的数据类型&#xff0c;使得用户能够在Python中方便地进行GIS操作。GeoPandas的核心数据结构是GeoDataFrame&#xff0c;它是Pandas的DataFrame的…