精华内容
下载资源
问答
  • 相邻帧差法和三帧差法

    千次阅读 2019-07-17 21:36:04
    相邻帧差法和三帧差法 原文地址:https://blog.csdn.net/dcrmg/article/details/52234929 帧间差分法是通过对视频中相邻两帧图像做差分运算来标记运动物体的方法。 帧差法依据的原则是:当视频中存在移动物体的...

    相邻帧差法和三帧差法

    原文地址:https://blog.csdn.net/dcrmg/article/details/52234929

     

    帧间差分法是通过对视频中相邻两帧图像做差分运算来标记运动物体的方法。

    帧差法依据的原则是:当视频中存在移动物体的时候,相邻帧(或相邻三帧)之间在灰度上会有差别,求取两帧图像灰度差的绝对值,则静止的物体在差值图像上表现出来全是0,而移动物体特别是移动物体的轮廓处由于存在灰度变化为非0,这样就能大致计算出移动物体的位置、轮廓和移动路径等。

    帧间差分法的优点是算法实现简单,程序设计复杂度低;对光线等场景变化不太敏感,能够适应各种动态环境,稳定性较好。缺点是不能提取出对象的完整区域,对象内部有“空洞”,只能提取出边界,边界轮廓比较粗,往往比实际物体要大。对快速运动的物体,容易出现鬼影的现象,甚至会被检测为两个不同的运动物体,对慢速运动的物体,当物体在前后两帧中几乎完全重叠时,则检测不到物体。

    相邻帧间差分法

    相邻帧间差分法直接对相邻的两帧图像做差分运算,并取差分运算的绝对值构成移动物体,优点是运算快速,实时性高,缺点是无法应对光照的突变,物体间一般具有空洞。

    C++、Opencv实现:

    1. #include "core/core.hpp"

    2. #include "highgui/highgui.hpp"

    3. #include "imgproc/imgproc.hpp"

    4.  
    5. using namespace cv;

    6.  
    7. int main(int argc,char *argv[])

    8. {

    9. VideoCapture videoCap(argv[1]);

    10. if(!videoCap.isOpened())

    11. {

    12. return -1;

    13. }

    14. double videoFPS=videoCap.get(CV_CAP_PROP_FPS); //获取帧率

    15. double videoPause=1000/videoFPS;

    16.  
    17. Mat framePre; //上一帧

    18. Mat frameNow; //当前帧

    19. Mat frameDet; //运动物体

    20. videoCap>>framePre;

    21. cvtColor(framePre,framePre,CV_RGB2GRAY);

    22. while(true)

    23. {

    24. videoCap>>frameNow;

    25. if(frameNow.empty()||waitKey(2500)==27)

    26. {

    27. break;

    28. }

    29. cvtColor(frameNow,frameNow,CV_RGB2GRAY);

    30. absdiff(frameNow,framePre,frameDet);

    31. framePre=frameNow;

    32. imshow("Video",frameNow);

    33. imshow("Detection",frameDet);

    34. }

    35. return 0;

    36. }

     

     

    调用了Opencv自带的视频文件“768x576.avi”,视频文件位置:“opencv\sources\samples\gpu”,下图是视频第100帧时图像:

     

    下图是相邻两帧差法检测到的物体,检测效果没有经过膨胀或腐蚀等处理:

     

    可以看到物体的轮廓是“双边”的,并且物体的移动速度越快,双边轮廓现象越粗越明显(这是不是给监控中速度检测提供了一个思路~~),另一个就是物体具有较大的空洞。

     

    三帧差法

     

    三帧差法是在相邻帧差法基础上改进的算法,在一定程度上优化了运动物体双边,粗轮廓的现象,相比之下,三帧差法比相邻帧差法更适用于物体移动速度较快的情况,比如道路上车辆的智能监控。

     

    三帧差法基本实现步骤:

    1. 前两帧图像做灰度差

    2. 当前帧图像与前一帧图像做灰度差

    3. 1和2的结果图像按位做“与”操作

     

    C++、Opencv实现:

     

    
     
    1. #include "core/core.hpp"

    2. #include "highgui/highgui.hpp"

    3. #include "imgproc/imgproc.hpp"

    4.  
    5. using namespace cv;

    6.  
    7. int main(int argc,char *argv[])

    8. {

    9. VideoCapture videoCap(argv[1]);

    10. if(!videoCap.isOpened())

    11. {

    12. return -1;

    13. }

    14. double videoFPS=videoCap.get(CV_CAP_PROP_FPS); //获取帧率

    15. double videoPause=1000/videoFPS;

    16. Mat framePrePre; //上上一帧

    17. Mat framePre; //上一帧

    18. Mat frameNow; //当前帧

    19. Mat frameDet; //运动物体

    20. videoCap>>framePrePre;

    21. videoCap>>framePre;

    22. cvtColor(framePrePre,framePrePre,CV_RGB2GRAY);

    23. cvtColor(framePre,framePre,CV_RGB2GRAY);

    24. int save=0;

    25. while(true)

    26. {

    27. videoCap>>frameNow;

    28. if(frameNow.empty()||waitKey(videoPause)==27)

    29. {

    30. break;

    31. }

    32. cvtColor(frameNow,frameNow,CV_RGB2GRAY);

    33. Mat Det1;

    34. Mat Det2;

    35. absdiff(framePrePre,framePre,Det1); //帧差1

    36. absdiff(framePre,frameNow,Det2); //帧差2

    37. threshold(Det1,Det1,0,255,CV_THRESH_OTSU); //自适应阈值化

    38. threshold(Det2,Det2,0,255,CV_THRESH_OTSU);

    39. Mat element=getStructuringElement(0,Size(3,3)); //膨胀核

    40. dilate(Det1,Det1,element); //膨胀

    41. dilate(Det2,Det2,element);

    42. bitwise_and(Det1,Det2,frameDet);

    43. framePrePre=framePre;

    44. framePre=frameNow;

    45. imshow("Video",frameNow);

    46. imshow("Detection",frameDet);

    47. }

    48. return 0;

    49. }


    同样是“768x576.avi”视频文件,并且也保存了第100帧的原始图像和运动物体检测图像:

     

     

    未经形态学处理的原始的三帧差法检测到的运动物体:

     

    未经任何形态学处理的原始的三帧差法检测到的物体的双边轮廓现象有所改善,但同时也有丢失轮廓的现象。

     

    下图是在两个帧差图像按位与操作之前做了一下膨胀处理的效果:

     

    相比相邻两帧差法,原始的三帧差法对物体的双边粗轮廓和“鬼影”现象有所改善,比较适合对运动速度较快物体的检测,但是仍然会有空洞出现,并且物体移动速度较慢时容易丢失轮廓。

     

    当然三帧差法做了两次的差分运算,给了三帧差法更多可操作和优化的空间,为更优秀的检测效果提供了可能。

    展开全文
  • 帧差法和三帧差法

    千次阅读 2020-05-12 17:37:17
    帧差法 //取两帧图像 if(preSafetyRopeDetectionFrame.empty()){ preSafetyRopeDetectionFrame = curFrame;//将第一帧赋给preFrame preSafetyRopeDetectionFrameIdx = detectTrackInfo.GetCurFrameIdx(); } else...

    帧差法

    //取两帧图像
    if(preSafetyRopeDetectionFrame.empty()){
         preSafetyRopeDetectionFrame = curFrame;//将第一帧赋给preFrame
         preSafetyRopeDetectionFrameIdx = detectTrackInfo.GetCurFrameIdx();
    }
    else{
         if((detectTrackInfo.GetCurFrameIdx() - preSafetyRopeDetectionFrameIdx) % 10 == 0){
             SafetyRopeDetection(curFrame, dressingCheckResultVec, eventOccur);//安全绳的检测实现
             preSafetyRopeDetectionFrame = curFrame;
             preSafetyRopeDetectionFrameIdx = detectTrackInfo.GetCurFrameIdx();
         }
    }
    
    
    //帧差法--未进行形态学处理(膨胀,边缘等操作)
    cv::Mat frameROI = curFrame(detectSafetyRopeROI);   //取检测区域ROI
    cv::Mat showImg = frameROI.clone();
    cv::Mat preFrameROI = preSafetyRopeDetectionFrame(detectSafetyRopeROI);
    cvtColor(frameROI, frameROI, cv::COLOR_BGR2GRAY); //转成灰度图
    cvtColor(preFrameROI, preFrameROI, cv::COLOR_BGR2GRAY); //转成灰度图
    cv::Mat cutframe;
    absdiff(frameROI, preFrameROI, cutframe);  //图像做差
    cv::imwrite("cha.jpg", cutframe);
    cv::threshold(cutframe, cutframe, 100, 255, cv::THRESH_BINARY);  //二值化差值图像
    cv::imwrite("2.jpg", cutframe);

    三帧差法

    //取三帧图像
    if(preSafetyRopeDetectionFrame.empty()){
         preSafetyRopeDetectionFrame = curFrame;//将第一帧赋给preFrame
         preSafetyRopeDetectionFrameIdx = detectTrackInfo.GetCurFrameIdx();
    }
    else if(midSafetyRopeDetectionFrame.empty() && (detectTrackInfo.GetCurFrameIdx()- preSafetyRopeDetectionFrameIdx) % 20 == 0){
         midSafetyRopeDetectionFrame = curFrame;//将第一帧赋给preFrame
         midSafetyRopeDetectionFrameIdx = detectTrackInfo.GetCurFrameIdx();
    }
    else{
         if((midSafetyRopeDetectionFrameIdx - preSafetyRopeDetectionFrameIdx) % 20 == 0 && (detectTrackInfo.GetCurFrameIdx() - midSafetyRopeDetectionFrameIdx) % 20 == 0){    
              SafetyRopeDetection(curFrame, dressingCheckResultVec, eventOccur);//安全绳的检测实现
              preSafetyRopeDetectionFrame = midSafetyRopeDetectionFrame;
              preSafetyRopeDetectionFrameIdx = midSafetyRopeDetectionFrameIdx;
              midSafetyRopeDetectionFrame = curFrame;
              midSafetyRopeDetectionFrameIdx = detectTrackInfo.GetCurFrameIdx();
         }
    }
    
    
    //三帧差法
    cv::Mat preFrameROI = preSafetyRopeDetectionFrame(detectSafetyRopeROI); //取检测挂线的ROI区域
    cv::Mat midFrameROI = midSafetyRopeDetectionFrame(detectSafetyRopeROI);
    cv::Mat frameROI = curFrame(detectSafetyRopeROI);
    cv::Mat showImg = midFrameROI.clone();  //保留第二帧原图用于画线
    cvtColor(preFrameROI, preFrameROI, cv::COLOR_BGR2GRAY); //转成灰度图
    cvtColor(midFrameROI, midFrameROI, cv::COLOR_BGR2GRAY); //转成灰度图
    cvtColor(frameROI, frameROI, cv::COLOR_BGR2GRAY); //转成灰度图
    cv::Mat difframe1,difframe2,difframe3,cutframe;
    absdiff(midFrameROI, preFrameROI, difframe1);//做差求绝对值   2-1
    absdiff(midFrameROI, frameROI, difframe2);//做差求绝对值      2-3
    bitwise_and(difframe1, difframe2, difframe3);  //做与运算
    cv::imwrite("cha.jpg", difframe3);
    cv::threshold(difframe3, cutframe, 100, 255, cv::THRESH_BINARY);  //二值化差值图像
    cv::imwrite("2.jpg", cutframe);

     

    展开全文
  • 帧差法总结

    万次阅读 2020-01-10 15:52:17
    相邻帧差法:称图像序列差分法  # 帧间 差法 ! 当监控场景中出现异常物体运运时"帧与帧之间会出现较为明显的差别"两帧相减"得到两帧图像亮度差的绝对值 "  判断它是否大于阈值来分析视频或图像序列的运动...

     

    相邻帧差法:称图像序列差分法 

    # 帧间 差法 ! 当监控场景中出现异常物体运运时"帧与帧之间会出现较为明显的差别"两帧相减"得到两帧图像亮度差的绝对值 " 
    判断它是否大于阈值来分析视频或图像序列的运动特性"确定图像序列中有无物体运动 ! 
    图像序列逐帧的 差分 " 相当于对图 像序列 进行了 时域上的 高通滤波!     
     1、做帧差:采集前一帧图像,第二帧图像,先对其进行灰度化处理。然后前后做差取绝对值,把两次所得新的灰度图像进行相与,将差分后的图像二值化后进行边缘检测。   
    2、边缘检测(画边框):由以上步骤可得运动目标边缘的轮廓。 图像二值化后所得的图像就是由0或1组成的 图 像。
    因此,要找到这个图像的最高点、最低点、最左点、最右点,可用数点的办法找到这些点,进而确定这个矩形框。  
    3、判断是否是人入侵:由于一个正常人的人体高宽是比例是一定的,根据这个特征一个较为简单的判据为:通过运动区域的斜率来判别人。假设通道内的人只能走向摄像头,根据经验所得:当此斜率小于0.48时就可以判定是人入 侵,大于0.48为非人员入侵。 剔除一些小动物。如蜘蛛苍蝇等小虫子对其干扰而产生误报,可将红色矩形框的长和宽进行调 整,例如,将矩形框长和宽都大于等于5。 
    4、实现方法:运动目标检测部分用帧间差算法实现,目标识别部分用基于运动区域斜率的方法完成。

    好的论文:

    https://wenku.baidu.com/view/dce71619227916888486d73a.html?sxts=1578642638774

    展开全文
  • 2. 使用MATLAB语言编程实现背景差分法、帧差法和三帧差法; 3. 比较背景差分法、帧差法和三帧差法的特点,并了解该算法的应用条件; 二、实验环境 Windows+matlab 三、实验内容和步骤 1.简述背景差法的原理 2...

    一、实验目的与要求
    1. 熟悉经典目标检测算法的原理;
    2. 使用MATLAB语言编程实现背景差分法、帧差法和三帧差法;
    3. 比较背景差分法、帧差法和三帧差法的特点,并了解该算法的应用条件;
    二、实验环境
    Windows+matlab
    三、实验内容和步骤
    1.简述背景差法的原理
    2.简述帧差法的原理
    3.简述三帧差法的原理
    四、实验结果与分析
    MATLAB语言编程实现背景差分法、帧差法和三帧差法,并且用矩形框标识目标。编写实验程序和仿真结果, 写出算法的应用条件;

    展开全文
  • matlab帧差法

    2015-01-11 18:30:51
    帧差法 matlab7.1 视频跟踪 亲测可运行,不能运行就是你matlab没配置对
  • 经典三帧差法代码

    2018-11-03 11:24:01
    经典三帧差法的代码,可以在MATLAB中进行仿真
  • matlab帧差法物体检测

    2018-04-02 19:19:45
    matlab帧差法对运动物体的检测。内含代码以及测试视频。
  • opencv帧差法运动检测

    2016-03-24 14:39:28
    opencv帧差法运动检测
  • 目标跟踪之帧差法C++

    2013-04-09 15:55:57
    目标跟踪 帧差法 C++ 目标跟踪 帧差法 C++ 目标跟踪 帧差法 C++ 目标跟踪 帧差法 C++
  • opencv 运动检测 三帧差法

    千次阅读 多人点赞 2018-12-09 08:00:09
    opencv 运动检测 三帧差法    三帧差法 优点: 实时性高 缺点: 1、运动物体本身颜色相近时,会出现较大的空洞。 2、无法应对光照骤变的情况 理论上:三帧差法 比 二帧差法更好一些(可在一定程度上消除帧...
  • VIBE背景帧差法

    热门讨论 2011-12-26 15:52:43
    这是老外写的一个帧差法,2011刚出版的,比现有的混合高斯,直接背景帧差法都要好,已做成产品
  • 帧差法改进matlab源代码

    热门讨论 2012-10-28 12:52:21
    这个算法是基于原有的帧差法的基础上,利用连续3帧(可以连续多帧)互做帧差法,然后得到的结果再次做帧差,直到最后只有一个结果。
  • 帧差法依据的原则是:当视频中存在移动物体的时候,相邻帧(或相邻三帧)之间在灰度上会有差别,求取两帧图像灰度差的绝对值,则静止的物体在差值图像上表现出来全是0,而移动物体特别是移动物体的轮廓处由于存在...
  • opencv2.4.11 实现帧差法,检测运动目标,也可使用电脑摄像头,检测运动目标。代码清晰易懂,直接运行。
  • 基于FPGA的帧差法仿真实现一、帧差法的原理及应用帧差法就是帧间差分法,帧差法是最为常用的行动目标检测措施之一,原理即是在图像序列邻接两帧或三帧间基于像素做差分运算来获取。率先,将邻接帧...
  • 基于帧差法利用opencv2.0进行目标检测,适用于静态背景下
  • OpenCV:帧差法

    千次阅读 2019-06-17 17:09:47
    帧差法原理 帧差法可以用来提取视频中的前景,也就是运动的物体,通过将不同帧进行相减,获取两帧之间的差异,然后再用图像处理算法将差异显示出来。可以将视频的第一帧作为背景,也可以将相邻两帧的前一帧作为...
  • 上传资源为基于opencv平台的目标检测代码,所用方法为背景帧差法
  • python+opencv移动侦测(帧差法)

    千次阅读 2019-07-04 15:54:01
    1.帧差法原理 移动侦测即是根据视频每帧或者几帧之间像素的差异,对差异值设置阈值,筛选大于阈值的像素点,做掩模图即可选出视频中存在变化的桢。帧差法较为简单的视频中物体移动侦测,帧差法分为:单帧差、两桢差...
  • 交通路口监控系统因其能够主动收集分析数据,...对不同环境条件产生的多种图像处理方法"文中对其中两种方法: 帧差法和背景差分法,在一般情况下的优劣性进行 分析研究,通过模拟仿真得到帧差法要比背景差分法准确性更高
  • opencv 运动检测 二帧差法

    千次阅读 2018-12-09 07:44:18
    opencv 运动检测 二帧差法    1. 帧差法基本原理  帧间差分法是一种通过对视频图像序列的连续两帧图像做差分运算获取运动目标轮廓的方法。当监控场景中出现异常目标运动时,相邻两帧图像之间会出现较为明显的...
  • 关于帧差法的想法(opencv)

    千次阅读 2019-07-19 16:05:31
    帧差法 帧差法,顾名思义就是将视频中前后两帧做减法,当前帧在(x,y)点处的像素值减去上一帧在(x,y)处的像素值。该方法的优点是提取效果比较稳定,速度比较快。缺点也是蛮明显的,如果你要提取的目标是静止的...
  • opencv 帧差法 absdiff

    万次阅读 2016-03-11 09:52:56
    opencv 帧差法 absdiff opencv2.3.1里的以下函数可计算当前帧与背景之差的绝对值。 cv::absdiff(backgroundImage,currentImage,foreground); 如果摄像机是固定的,那么我们可以认为场景(背景)大多数...
  • opencv实现三帧差法

    千次阅读 2017-08-07 12:49:53
    今天和大家谈谈三帧差法来实现运动目标检测吧,其中运动检测画框实现追踪方法多种多样,大家可以自行百度,后面我也会一一实现,今天我先给大家玩玩三帧差法吧;;;;(注释非常清楚哦,程序也极其简单的)帧差法是...
  • c++调用opencv库实现视频关键帧提取--灰度帧差法

    千次阅读 热门讨论 2019-05-16 13:08:33
    为了提取关键帧,这里使用帧差法,语言为C语言,调用opencv库实现。 我们将视频第一帧设定为关键帧,后面的每一个帧与前一个关键帧进行像素帧差(灰度图),并设定阈值判断发生变化的像素点比例,通过此比例判断帧...
  • 帧差法实现运动目标检测与跟踪,可以自己选择二值化阈值,背景更新速率以及物体选择框最小的大小
  • OpenCV实现帧差法

    千次阅读 2013-07-19 10:48:11
    帧差法是运动目标检测中一个非常重要的方法,它的原理十分简单。思路是设置一个阈值,然后将视频中相邻的两帧相减,结果中大于阈值的地方就是运动区域。 帧差法的优势是运算量小,实时性好,可以获得不错的轮廓。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,091
精华内容 7,636
关键字:

帧差法