帧差法
三帧差法
录频工具转gif


#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
VideoCapture videoCap(0);
if (!videoCap.isOpened())
{
return -1;
}
double videoFPS = videoCap.get(CV_CAP_PROP_FPS); //获取帧率
double videoPause = 1000 / videoFPS;
Mat framePrePre; //上上一帧
Mat framePre; //上一帧
Mat frameNow; //当前帧
Mat frameDet; //运动物体
videoCap >> framePrePre;
videoCap >> framePre;
cvtColor(framePrePre, framePrePre, CV_RGB2GRAY);
cvtColor(framePre, framePre, CV_RGB2GRAY);
int save = 0;
while (true)
{
videoCap >> frameNow;
// if (frameNow.empty() || waitKey() == 27)
if (frameNow.empty() )
{
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);
Mat element = getStructuringElement(0, Size(3, 3)); //膨胀核
dilate(Det1, Det1, element); //膨胀
dilate(Det2, Det2, element);
bitwise_and(Det1, Det2, frameDet);
framePrePre = framePre;
framePre = frameNow;
imshow("Video", frameNow);
imshow("Detection", frameDet);
waitKey(1);
}
return 0;
}
画正弦曲线
#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include "opencv/cv.h"
#include "opencv/highgui.h"
using namespace cv;
int main(int argc, char *argv[])
{
double y[400];
float x;
for (x = 0; x<400; x++)
{
// y[(int)floor(x)] = sin(x);
y[(int)floor(x)] = 200 + 100 * sin(x*0.2);
}
Mat grf(410, 410, CV_8UC3);// CV_8UC3 CV_32F
for (int x = 0; x<400; x++)
{
line(grf, /* the dest image */
cvPoint(x, y[x]), /* start point */
cvPoint(x + 1, y[x + 1]), /* end point */
Scalar(0, 255, 0), /* the color; green */
2, 4, 0); /* thickness, line type, shift */
}
cvNamedWindow("img", CV_WINDOW_AUTOSIZE);
imshow("img", grf);
VideoCapture videoCap(0);
if (!videoCap.isOpened())
{
return -1;
}
double videoFPS = videoCap.get(CV_CAP_PROP_FPS); //获取帧率
double videoPause = 1000 / videoFPS;
Mat framePrePre; //上上一帧
Mat framePre; //上一帧
Mat frameNow; //当前帧
Mat frameDet; //运动物体
videoCap >> framePrePre;
videoCap >> framePre;
cvtColor(framePrePre, framePrePre, CV_RGB2GRAY);
cvtColor(framePre, framePre, CV_RGB2GRAY);
int save = 0;
while (true)
{
videoCap >> frameNow;
// if (frameNow.empty() || waitKey() == 27)
if (frameNow.empty() )
{
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);
Mat element = getStructuringElement(0, Size(9, 9)); //膨胀核
dilate(Det1, Det1, element);
dilate(Det2, Det2, element);
bitwise_and(Det1, Det2, frameDet);
framePrePre = framePre;
framePre = frameNow;
imshow("Video", frameNow);
cvtColor(frameDet, frameDet, CV_GRAY2RGB);
for (int x = 0; x<400; x++)
{
line(frameDet, /* the dest image */
cvPoint(x, y[x]), /* start point */
cvPoint(x + 1, y[x + 1]), /* end point */
Scalar(0, 255, 0), /* the color; green */
2, 4, 0); /* thickness, line type, shift */
}
imshow("Detection", frameDet);
waitKey(1);
}
return 0;
}