首先,我们对视频的处理是通过对视频中每一帧的处理进行的。
一般地,播放并处理一段视频有以下几种基本操作:读取视频,获取视频参数,获取视频帧,对视频帧添加各种操作。我们用一段代码来说明一下。
//功能:读取指定路径的视频;
// 对视频进行一系列操作,包括:灰度化 --> 滤波 --> 二值化 --> 形态学处理。
//环境:VS2015+opencv2.4.9
#include<iostream>
#include<highgui.h>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
int main(void)
{
//打开视频文件
VideoCapture capture("D:/360Downloads/AVI vedio/VID20180131083455.avi");
//isOpen判断视频是否打开成功
if (!capture.isOpened())
{
cout << "Movie open error" << endl;
return -1;
}
//获取视频帧率
double rate = capture.get(CV_CAP_PROP_FPS);
cout << "帧率为:" << " "<< rate << endl;
//获取总帧数
int total_rate = capture.get(CV_CAP_PROP_FRAME_COUNT);
//输出帧总数
cout << "总帧数为:" << " " << total_rate << endl;
Mat frame; //定义一个Mat类,用于存放视频帧
//定义形态学处理所需的内核
Mat element=getStructuringElement(MORPH_RECT,Size(3,3));
//建立一个窗口用于显示视频
namedWindow("Movie Player");
while (1)
{
//读取视频帧
if (!capture.read(frame))
break;
//添加操作
cvtColor(frame,frame,CV_BGR2GRAY); //颜色空间转换
medianBlur(frame, frame,3); //中值滤波
threshold(frame, frame, 55, 220, 0); //二值化,显示大于55的像素值,其余为220
morphologyEx(frame, frame, MORPH_OPEN, element); //开运算
imshow("Movie Player", frame);
//获取按键值
char c = waitKey(33);
if (c == 27) //27为"Esc"的ASCII码值,表示按下"Esc"时退出视频播放
break;
}
return 0;
}