当前位置: 首页 > article >正文

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

在这里插入图片描述

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

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.kler.cn/news/304474.html

相关文章:

  • Maven从入门到精通(三)
  • IVF 视频文件格式
  • [网络][CISCO]CISCO_华为网络设备端口镜像配置
  • Cache Aside pattern
  • EG边缘计算网关连接纵横云3.0物联网平台(MQTT协议)
  • Notepad++插件:TextFX 去除重复行
  • 快速理解Redis
  • 【系统规划与管理师】【案例分析】【考点】【问题篇】第5章 IT服务部署实施
  • MiniCPM-V: A GPT-4V Level MLLM on Your Phone
  • Ansys HFSS的边界条件与激励端口
  • 【Linux入门】iptables的安装与配置应用实例
  • pg \d 在不同模式下有同名表时注意事项
  • 828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统
  • 软件工程毕业设计开题汇总
  • 如何在 DigitalOcean Droplet 云服务器上部署 Next.js 应用
  • 技术周刊 | Vue3.5、Replit Agent、Cursor 使用技巧、React 19 中的新功能、8 月 Web 平台的新功能
  • 9.11 QT ( Day 4)
  • oracle数据库安装和配置详细讲解
  • 个人学习笔记6-2:动手学深度学习pytorch版-李沐
  • Qt使用UDP进行单波通信
  • 实习项目|苍穹外卖|day9
  • mmseqs2进行pdb蛋白质序列聚类分析
  • 在云服务器上安装 RabbitMQ:从零到一的最佳实践
  • 机械学习—零基础学习日志(Python做数据分析03)
  • JS函数 匿名函数(ES6箭头函数)弄得懂吗?
  • linux 定时将固态硬盘数据备份至机械硬盘
  • 测试质量体系的风险评估和应对措施有哪些
  • UART 16550的使用
  • Git常用命令备忘
  • 【数据结构和算法实践-树-LeetCode110-平衡二叉树】