基于帧间差进行运动目标检测

相邻帧差检测:优点是运算快速,实时性高,缺点是无法应对光照的突变,物体间一般具有空洞。

三帧差检测:在一定程度上优化了运动物体双边,粗轮廓的现象,相比之下,三帧差法比相邻帧差法更适用于物体移动速度较快的情况。

cpp 复制代码
#include <opencv2/opencv.hpp>


/**
 * @brief diff2_detec   相邻帧差运动目标检测
 * @param gray_pre      输入:前一帧图像(gray)
 * @param gray_now      输入:当前帧图像(gray)
 * @return              输出:图像是否为全黑,全黑返回false,非全黑返回true
 */
bool diff2_detection(cv::Mat gray_pre, cv::Mat gray_now)
{
    cv::Mat diff;
    cv::absdiff(gray_pre, gray_now, diff);
    threshold(diff, diff, 0, 255, cv::THRESH_OTSU);     //自适应阈值化
    // 形态学操作
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(8, 8));
    cv::morphologyEx(diff, diff, cv::MORPH_OPEN, kernel);

    // 显示结果
    cv::imshow("Output", diff);
    cv::waitKey(100);

    if(mean(diff).val[0] > 0.01)        // 计算差分图像灰度平均值
    {
        return true;
    }
    else
    {
        return false;
    }
}

/**
 * @brief diff3_detec   三帧差运动目标检测
 * @param gray_pre      输入:前一帧图像(gray)
 * @param gray_now      输入:当前帧图像(gray)
 * @param gray_next     输入:后一帧图像(gray)
 * @return              输出:图像是否为全黑,全黑返回false,非全黑返回true
 */
bool diff3_detection(cv::Mat gray_pre, cv::Mat gray_now, cv::Mat gray_next)
{
    cv::Mat diff_pre, diff_next, diff;
    // 计算帧差
    cv::absdiff(gray_pre, gray_now, diff_pre);
    cv::absdiff(gray_now, gray_next, diff_next);
    threshold(diff_pre, diff_pre, 0, 255, cv::THRESH_OTSU);     //自适应阈值化
    threshold(diff_next, diff_next, 0, 255, cv::THRESH_OTSU);   //自适应阈值化

    // 形态学操作
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(8, 8));
    cv::morphologyEx(diff_pre, diff_pre, cv::MORPH_OPEN, kernel);
    cv::morphologyEx(diff_next, diff_next, cv::MORPH_OPEN, kernel);
    cv::bitwise_and(diff_pre, diff_next, diff);//与操作

    // 显示结果
    cv::imshow("Output", diff);
    cv::waitKey(100);

    if(mean(diff).val[0] > 0.01)        // 计算差分图像灰度平均值
    {
        return true;
    }
    else
    {
        return false;
    }
}



int main()
{
    // 打开视频文件
    cv::VideoCapture cap("video.mp4");
    if (!cap.isOpened())
    {
        std::cout << "无法打开视频文件" << std::endl;
        return -1;
    }

    cv::Mat frame_pre, frame_now, frame_next;
    cv::Mat gray_pre, gray_now, gray_next;

    // 读取前三帧图像
    cap >> frame_pre;
    cv::cvtColor(frame_pre, gray_pre, cv::COLOR_BGR2GRAY);

    cap >> frame_now;
    cv::cvtColor(frame_now, gray_now, cv::COLOR_BGR2GRAY);

    cap >> frame_next;
    cv::cvtColor(frame_next, gray_next, cv::COLOR_BGR2GRAY);

    while (true)
    {
        diff2_detection(gray_pre, gray_now);
        diff3_detection(gray_pre, gray_now, gray_next);

        // 更新帧
        gray_pre = gray_now.clone();
        gray_now = gray_next.clone();

        cap >> frame_next;
        if (frame_next.empty()) {
            break;
        }
        cv::cvtColor(frame_next, gray_next, cv::COLOR_BGR2GRAY);
    }

    // 释放资源
    cap.release();
    cv::destroyAllWindows();

    return 0;
}
相关推荐
电科_银尘3 小时前
【深度学习项目实战·17】行人目标检测:用Faster R-CNN找出图片中的行人
深度学习·目标检测·r语言
星云_byto3 小时前
CSS布局
人工智能·机器学习·目标跟踪·1024程序员节
会飞锦鲤1 天前
基于 SVM + HOG 的铸造缺陷检测系统
python·opencv·机器学习·计算机视觉·缺陷检测·图像分类·svm
李帅朋1 天前
INP-Former阅读笔记
笔记·深度学习·计算机视觉
ZhengEnCi2 天前
一句话定位图片中目标最准的模型是哪个:2026 视觉定位 SOTA 全面评测与选型指南
计算机视觉
小豆庄2 天前
测试视频里的人脸车牌敏感信息自动化脱敏方案
计算机视觉·目标跟踪·ffmpeg·音视频·边缘计算·视频·敏捷流程
LUCIALEE3 天前
训练越久越差:两个无人机小样本,把 3DGS 正射 TDOM 的边界跑出来了
计算机视觉
微尘hjx3 天前
【Deep-OC-SORT 01】多轨迹算法Deep-OC-SORT源码分析
深度学习·yolo·目标跟踪·ultralytics·轨迹算法·deep-oc-sort·车流统计
AI日报派送佬3 天前
高效目标检测利器:X-AnyLabeling 加载自定义 YOLO 模型自动标注实操指南
人工智能·yolo·目标检测
陈嘿萌3 天前
ECCV 2026 | CausalDrive:澳门大学×小米汽车,面向自动驾驶的实时因果世界模型
图像处理·人工智能·深度学习·计算机视觉·自动驾驶·学术研究与理论基础