// FrameDiff.cpp : 定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include
using namespace std;
#include
#include
#include
using namespace cv;
const unsigned char FORE_GROUD = 127;
int thresh = 15;
int main(int argc, char*argv[])
{
VideoCapture video("D:/文档/研究生/研二/交通行为参数提取/数据/交叉口视频/test1.avi");
//判断如果video是否可以打开
if (!video.isOpened())
return -1;
//用于保存当前帧的图片
Mat currentBGRFrame;
//用来保存上一帧和当前帧的灰度图片
Mat previousGrayFrame;
Mat currentGaryFrame;
//用来保存帧差
Mat frameDifference;//CV_16SC1
//用来保存帧差的绝对值
Mat absFrameDifferece;
//用来显示前景
Mat segmentation;
//显示原视频
namedWindow("原视频", 0);
//显示前景
namedWindow("二值化", 0);
cvResizeWindow("二值化", 500, 500);
createTrackbar("阈值:", "二值化", &thresh, FORE_GROUD, NULL);
//帧数
int numberFrame = 0;
//形态学处理用到的算子
Mat morphologyKernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
for (;;)
{
//读取当前帧
video >> currentBGRFrame;
//判断当前帧是否存在
if (!currentBGRFrame.data)
break;
numberFrame++;
if (numberFrame == 1)
{
//颜色空间的转换
cvtColor(currentBGRFrame, currentGaryFrame, COLOR_BGR2GRAY);
//保存当前帧的灰度图
previousGrayFrame = currentGaryFrame.clone();
imshow("原视频", currentBGRFrame);
continue;
}
else
{
//颜色空间的转换
cvtColor(currentBGRFrame, currentGaryFrame, COLOR_BGR2GRAY);
//src1-src2
subtract(currentGaryFrame, previousGrayFrame, frameDifference, Mat(), CV_16SC1);
//取绝对值
absFrameDifferece = abs(frameDifference);
//位深的改变
absFrameDifferece.convertTo(absFrameDifferece, CV_8UC1, 1, 0);
//阈值处理
threshold(absFrameDifferece, segmentation, double(thresh), double(FORE_GROUD), THRESH_BINARY);
//中值滤波
medianBlur(segmentation, segmentation, 3);
//形态学处理(开闭运算)
morphologyEx(segmentation,segmentation,MORPH_OPEN,morphologyKernel,Point(-1,-1),1,BORDER_REPLICATE);
morphologyEx(segmentation, segmentation, MORPH_CLOSE, morphologyKernel, Point(-1, -1), 2, BORDER_REPLICATE);
//显示二值化图片
imshow("二值化", segmentation);
//找边界
vector< vector > contours; //contours定义为2维浮点向量
vector hierarchy; //定义的层级
findContours(segmentation, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); //CV_RETR_TREE
vector< vector > contours_poly(contours.size());
/*存储运动物体*/
vector boundRect;
boundRect.clear();
//画出运动物体
//对视频中出现的运动物体,进行初次的筛选
for (int index = 0; index < contours.size(); index++)
{
approxPolyDP(Mat(contours[index]), contours_poly[index], 3, true);
Rect rect = boundingRect(Mat(contours_poly[index]));
if (rect.area() > 400)
rectangle(currentBGRFrame, rect, Scalar(0, 255, 255), 2);
}
//显示原视频
namedWindow("原视频", 1);
imshow("原视频", currentBGRFrame);
//保存当前帧的灰度图
previousGrayFrame = currentGaryFrame.clone();
}
if (waitKey(33) == 'q')
break;
}
return 0;
}