视频是大量具有时序关系图像的集合,
对视频的处理方式与对图像的处理方式相同,另外可以结合时序关系挖掘更深层信息。例如判断拍摄视频时相机是否移动、识别场景
中是否存在物体移动、
恢复场景中物体的三维信息等.本章中将重点介绍如何检测视频中移动
的物体,并对移动物体
进行
跟踪。
主要的方法有差值法、均值迁移法和光流法。
void visionagin:: Myabsdiff()
{
VideoCapture capture("C:\\Users\\86176\\Downloads\\visionimage\\vtest.avi");
if (!capture.isOpened())
{
cout << "视频打开失败!" << endl;
}
int fps = capture.get(CAP_PROP_FPS);
int Height = capture.get(CAP_PROP_FRAME_HEIGHT);
int Width = capture.get(CAP_PROP_FRAME_WIDTH);
int NumOfFrame = capture.get(CAP_PROP_FRAME_COUNT);
//读取视频中的第一帧图像作为前一帧
Mat preframe, pregray;
capture.read(preframe);
cvtColor(preframe, pregray, COLOR_BGR2GRAY);
//高斯滤波
GaussianBlur(pregray, pregray, Size(3, 3),15);
//生成形态学操作矩形模板
Mat k = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
Mat frame, gray, binary;
while (true)
{
if (!capture.read(frame))
{
break;//读取完毕结束
}
//灰度化当前帧图像
cvtColor(frame, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(3, 3), 15);
//计算当前帧与前一帧差值
absdiff(gray, pregray, binary);
//对结果二值化并进行开运算
threshold(binary, binary, 10, 255, THRESH_BINARY);
morphologyEx(binary, binary, MORPH_OPEN, k);
//显示处理结果
imshow("input", frame);
imshow("result", binary);
//将当前帧变成前一帧,如果注释掉下一行代码,那么程序章示固定背景的差值法
gray.copyTo(pregray);
int c = waitKey(50);
if (27 == c)
{
break;
}
}
}