本文主要是介绍三帧间差分法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
三帧差法
目的:解决帧间差分法的“双影”问题。算法步骤如下:
(1) Det1=framePre-framePrePre;
(2) Det2=frameNow-framePre;
(3) frameDet=Det1&Det2;
(4)形态学处理(如dilate).
************************************************************************/
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/video/video.hpp>
#include <iostream>
using namespace cv;
using namespace std; cv::Mat frame;
cv::Mat result;
char image_name[25];//三帧间差分
int main()
{int i=0;cv::Mat framePrePre, framePre, frameNow, frameDet;cv::Mat contours, contoursInv;cv::Mat Det1, Det2;VideoCapture capture("Crowd-Activity-All.avi");if (!capture.isOpened()){return 0;}double videoFPS = capture.get(CV_CAP_PROP_FPS); //获取帧率 double videoPause = 1000 / videoFPS;std::cout << videoFPS << endl;std::cout << videoPause << endl;capture >> framePrePre;capture >> framePre;cvtColor(framePrePre, framePrePre, CV_RGB2GRAY);cvtColor(framePre, framePre, CV_RGB2GRAY);int save = 0;bool stop(false);while (!stop){capture >> frameNow;if (frameNow.empty() || waitKey(videoPause) == 27){break;}cvtColor(frameNow, frameNow, CV_RGB2GRAY);Mat Det1;Mat Det2;absdiff(framePrePre, framePre, Det1); //帧差1 absdiff(framePre, frameNow, Det2); //帧差2 threshold(Det1, Det1, 0, 255, CV_THRESH_OTSU); //自适应阈值化 threshold(Det2, Det2, 0, 255, CV_THRESH_OTSU);bitwise_and(Det1, Det2, frameDet);Mat element = getStructuringElement(0, Size(3, 3)); //膨胀核 dilate(frameDet, frameDet, element); //膨胀 dilate(frameDet, frameDet, element); framePrePre = framePre;framePre = frameNow;imshow("Video", frameNow);imshow("Detection", frameDet);sprintf(image_name, ".\\three frames subtraction method_image\\%d.jpg", ++i);imwrite(image_name, frameDet);}return 0;
}
测试通过!
这篇关于三帧间差分法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!