【opencv450】帧间差分法

该博客介绍了使用OpenCV库通过帧间差分法进行背景提取的实验过程。首先将BMP图像转换为灰度图,然后计算两帧之间的绝对差值并设置阈值,接着进行膨胀和腐蚀操作以增强目标区域。最后展示处理后的图像。代码还包含了对视频帧处理的注释,展示了如何应用相同的方法处理连续帧来检测运动区域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

 

实验效果

源码:

/*=================================================
 * Version:
 * v1.0: 原版程序由IplImage转换为Mat
===================================================
*/


#include <opencv2/highgui.hpp>
#include <opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
    Mat  frame1, frame2, gray1, gray2, dif;
    frame1 = imread("0.bmp");
    frame2 = imread("3.bmp");
    cvtColor(frame1, gray1, COLOR_BGR2GRAY);
    cvtColor(frame2, gray2, COLOR_BGR2GRAY);

    //Mat C1frame1, C2frema2;
    //C1frame1.create(frame1.size(), CV_8UC1);
    //C2frema2.create(frame2.size(), CV_8UC1);
    Mat F1frame1, F1frame2;
    F1frame1.create(frame1.size(), CV_32FC1);
    F1frame2.create(frame2.size(), CV_32FC1);

    dif.create(frame1.size(), CV_32FC1);

    frame1.convertTo(F1frame1, CV_32FC1);
    frame2.convertTo(F1frame2, CV_32FC1);
    absdiff(F1frame1, F1frame2, dif);
    dif.convertTo(dif, CV_8UC1);
    threshold(dif, dif, 30, 255, cv::THRESH_BINARY);
    int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸//
    // 获取自定义核
    Mat element = getStructuringElement(MORPH_RECT,
        Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1),
        Point(g_nStructElementSize, g_nStructElementSize));
    // 膨胀//
    dilate(dif, dif, element);
    // 腐蚀//
    erode(dif, dif, element);

    resize(frame1, frame1, Size(478, 400));
    resize(frame2, frame2, Size(478, 400));
    resize(dif, dif, Size(478, 400));
    imshow("frame1", frame1);
    imshow("frame2", frame2);
    imshow("dif", dif);
    if (waitKey(0) != -1)
    {
        destroyAllWindows();
    }
    //VideoCapture capture;
    //capture = VideoCapture("./Camera Road 01.avi");
    //if (!capture.isOpened())
    //{
    //    capture = VideoCapture("../Video/Camera Road 01.avi");
    //    if (!capture.isOpened())
    //    {
    //        capture = VideoCapture("../../Video/Camera Road 01.avi");
    //        if (!capture.isOpened())
    //        {
    //            cout << "ERROR: Did't find this video!" << endl;
    //            return 0;
    //        }
    //    }
    //}

     用于遍历capture中的帧,通道数为3,需要转化为单通道才可以处理//
    //Mat tmpFrame, tmpFrameF;
     当前帧,单通道,uchar / Float
    //Mat currentFrame, currentFrameF;
     上一帧,单通道,uchar / Float
    //Mat previousFrame, previousFrameF;

    //int frameNum = 0;

    //capture >> tmpFrame;
    //while (!tmpFrame.empty())
    //{
    //    capture >> tmpFrame;
    //    //tmpFrame=cvQueryFrame(capture);
    //    frameNum++;
    //    if (frameNum == 1)
    //    {
    //        //第一帧先初始化各个结构,为它们分配空间//
    //        previousFrame.create(tmpFrame.size(), CV_8UC1);
    //        currentFrame.create(tmpFrame.size(), CV_8UC1);
    //        currentFrameF.create(tmpFrame.size(), CV_32FC1);
    //        previousFrameF.create(tmpFrame.size(), CV_32FC1);
    //        tmpFrameF.create(tmpFrame.size(), CV_32FC1);
    //    }

    //    if (frameNum >= 2)
    //    {
    //        //转化为单通道灰度图,此时currentFrame已经存了tmpFrame的内容//
    //        cvtColor(tmpFrame, currentFrame, cv::COLOR_BGR2GRAY);
    //        currentFrame.convertTo(tmpFrameF, CV_32FC1); 
    //        previousFrame.convertTo(previousFrameF, CV_32FC1);

    //        //做差求绝对值//
    //        absdiff(tmpFrameF, previousFrameF, currentFrameF);
    //        currentFrameF.convertTo(currentFrame, CV_8UC1);
    //        /*
    //        在currentFrameMat中找大于20(阈值)的像素点,把currentFrame中对应的点设为255
    //        此处阈值可以帮助把车辆的阴影消除掉
    //        */
    //        //            threshold(currentFrameF, currentFrame, 20, 255.0, CV_THRESH_BINARY);
    //        threshold(currentFrame, currentFrame, 30, 255, cv::THRESH_BINARY);

    //        int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸//
    //        // 获取自定义核
    //        Mat element = getStructuringElement(MORPH_RECT,
    //            Size(2 * g_nStructElementSize + 1, 2 * g_nStructElementSize + 1),
    //            Point(g_nStructElementSize, g_nStructElementSize));
    //        // 膨胀//
    //        dilate(currentFrame, currentFrame, element);
    //        // 腐蚀//
    //        erode(currentFrame, currentFrame, element);
    //    }

    //    //把当前帧保存作为下一次处理的前一帧//
    //    cvtColor(tmpFrame, previousFrame, cv::COLOR_BGR2GRAY);

    //    // 显示图像
    //    imshow("Camera", tmpFrame);
    //    imshow("Moving Area", currentFrame);
    //    waitKey(25);
    //}
   // destroyAllWindows();
}

参考:
背景提取算法——帧间差分法、背景差分法、ViBe算法、ViBe+算法_琦小虾的博客-优快云博客_背景差分法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值