#include <iostream>
#include "cv.h"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
// 描述:帧差法
int main()
{
//读入视频
VideoCapture capture(0);
namedWindow("当前视频帧", CV_WINDOW_NORMAL);
namedWindow("背景减图后区域", CV_WINDOW_NORMAL);
Mat tempframe, currentframe, currentframe2, currentframe3, currentframe4, currentframe5,previousframe; //定义 临时框架、现在框架、上一帧框架
Mat frame;
int framenum = 0;
while (true)
{
//读取帧
tempframe = capture.read(frame);
capture >> frame;
tempframe = frame;
framenum++;
if (framenum == 1)
{
cvtColor(tempframe, previousframe, CV_BGR2GRAY);
}
else
{
//将tempframe转为单通道灰度图,输出为currentframe
cvtColor(tempframe, currentframe, CV_BGR2GRAY);
//做差求绝对值,输出为currentframe,即差分图像
absdiff(currentframe, previousframe, currentframe2);
//遍历差分图像中点,将图像信息二值化,大于阈值20,为255,反之则为0,输出为currentframe
threshold(currentframe2, currentframe3, 20, 255.0, CV_THRESH_BINARY);
erode(currentframe3, currentframe4, Mat());//腐蚀
dilate(currentframe4, currentframe5, Mat());//膨胀
//查找轮廓并绘制轮廓
vector<vector<Point> > contours;
findContours(currentframe5, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
drawContours(frame, contours, -1, Scalar(0, 0, 255), 2);//在result上绘制轮廓
//查找正外接矩形
vector<Rect> boundRect(contours.size());
for (int i = 0; i < contours.size(); i++)
{
boundRect[i] = boundingRect(contours[i]);
rectangle(frame, boundRect[i], Scalar(0, 255, 0), 2);//在result上绘制正外接矩形
}
//显示图像
imshow("当前视频帧", tempframe);
imshow("背景减图后区域", currentframe5);
}
//把当前帧保存作为下一次处理的前一帧
cvtColor(tempframe, previousframe, CV_BGR2GRAY);
waitKey(33);
}
return 0;
}
会乱跑是什么意思?1、有可能算法不准确,随意矩形框画的区域是正确的区域,但是算法检测不准导致区域位置不正确,因此看到现象就是矩形框乱跑;2、算法也大致准确,矩形框小范围波动,那就需要加滤波看看,例如卡尔曼滤波
j就是动一下,然后不动,这个框不会消失,而是一直变化