主要 函数 类
VideoCapture 类 存储视频文件
初始化方式:
VideoCapture();
VideoCapture(const string& filename);
VideoCapture(int device);
bool VideoCapture::open(const string& filename);
bool VideoCapture::open(int device);
filename – 打开的视频文件名。
device – 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像头。
cv::VideoCapture video(“abc.mp4”) 打开指定位置的视频
cv::VideoCapture video(0) 打开的视频捕获设备id ,如果只有一个摄像头可以填0,表示打开默认的摄像头。
cv::VideoCapture video;
video.open(“abc.mp4”);
video.open(0)
判断是否已经打开
VideoCapture::isOpened
bool VideoCapture::isOpened();
video.isOpened();
功能:判断视频读取或者摄像头调用是否成功,成功则返回true。
关闭清除
VideoCapture::release
void VideoCapture::release();
video.release();
功能:关闭视频文件或者摄像头。
采集一帧
VideoCapture::grab
video.grab();
功能:从视频文件或捕获设备中抓取下一个帧,假如调用成功返回true。
解码并且返回刚刚抓取的视频帧
VideoCapture::retrieve
bool VideoCapture::retrieve(Mat& image, int channel=0);
功能:解码并且返回刚刚抓取的视频帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。
VideoCapture::read
VideoCapture::operator>>(Mat& image);
bool VideoCapture::read(Mat& image);
功能:该函数结合VideoCapture::grab()和VideoCapture::retrieve()其中之一被调用,用于捕获、解码和返回下一个视频帧这是一个最方便的函数对于读取视频文件或者捕获数据从解码和返回刚刚捕获的帧,假如没有视频帧被捕获(相机没有连接或者视频文件中没有更多的帧)将返回false。
// 方法一
capture.read(frame);
// 方法二
capture.grab();
// 方法三
capture.retrieve(frame);
// 方法四
capture >> frame;
VideoCapture::get
C++: double VideoCapture::get(int propId);
功能:一个视频有很多属性,比如:帧率、总帧数、尺寸、格式等,VideoCapture的get方法可以获取这些属性。
参数:属性的ID。
属性的ID可以是下面的之一:
CV_CAP_PROP_POS_MSEC 视频文件的当前位置(以毫秒为单位)。
CV_CAP_PROP_POS_FRAMES 接下来要解码/捕获的帧的基于0的索引。
CV_CAP_PROP_POS_AVI_RATIO 视频文件的相对位置:0 - 电影的开始,1 - 电影的结尾。
CV_CAP_PROP_FRAME_WIDTH 视频流中帧的宽度。
CV_CAP_PROP_FRAME_HEIGHT 视频流中帧的高度。
CV_CAP_PROP_FPS 帧速率。
CV_CAP_PROP_FOURCC 编解码器的4字符代码。
CV_CAP_PROP_FRAME_COUNT 视频文件中的帧数。
CV_CAP_PROP_FORMAT retrieve() 返回的Mat对象的格式。
CV_CAP_PROP_MODE 指示当前捕获模式的特定于后端的值。
CV_CAP_PROP_BRIGHTNESS 图像的亮度(仅适用于相机)。
CV_CAP_PROP_CONTRAST 图像对比度(仅适用于相机)。
CV_CAP_PROP_SATURATION 图像的饱和度(仅适用于相机)。
CV_CAP_PROP_HUE 图像的色调(仅适用于相机)。
CV_CAP_PROP_GAIN 图像的增益(仅适用于相机)。
CV_CAP_PROP_EXPOSURE 曝光(仅适用于相机)。
CV_CAP_PROP_CONVERT_RGB 布尔标志,指示是否应将图像转换为RGB。
CV_CAP_PROP_WHITE_BALANCE 目前不受支持
CV_CAP_PROP_RECTIFICATION 立体摄像机的整流标志(注意:目前仅支持DC1394 v 2.x后端)
VideoCapture::set
C++: bool VideoCapture::set(int propertyId, double value)
功能:设置VideoCapture类的属性,设置成功返回ture,失败返回false。
参数:第一个是属性ID,第二个是该属性要设置的值。
案例
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
//打开视频文件:其实就是建立一个VideoCapture结构
VideoCapture capture("D:/videos/PetsD2TeC2.avi");
//检测是否正常打开:成功打开时,isOpened返回ture
if(!capture.isOpened())
cout<<"fail to open!"<<endl;
//获取整个帧数
long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
cout<<"整个视频共"<<totalFrameNumber<<"帧"<<endl;
//设置开始帧()
long frameToStart = 300;
capture.set( CV_CAP_PROP_POS_FRAMES,frameToStart);
cout<<"从第"<<frameToStart<<"帧开始读"<<endl;
//设置结束帧
int frameToStop = 400;
if(frameToStop < frameToStart)
{
cout<<"结束帧小于开始帧,程序错误,即将退出!"<<endl;
return -1;
}
else
{
cout<<"结束帧为:第"<<frameToStop<<"帧"<<endl;
}
//获取帧率
double rate = capture.get(CV_CAP_PROP_FPS);
cout<<"帧率为:"<<rate<<endl;
//定义一个用来控制读取视频循环结束的变量
bool stop = false;
//承载每一帧的图像
Mat frame;
//显示每一帧的窗口
namedWindow("Extracted frame");
//两帧间的间隔时间:
//int delay = 1000/rate;
int delay = 1000/rate;
//利用while循环读取帧
//currentFrame是在循环体中控制读取到指定的帧后循环结束的变量
long currentFrame = frameToStart;
//滤波器的核
int kernel_size = 3;
Mat kernel = Mat::ones(kernel_size,kernel_size,CV_32F)/(float)(kernel_size*kernel_size);
while(!stop)
{
//读取下一帧
if(!capture.read(frame))
{
cout<<"读取视频失败"<<endl;
return -1;
}
//这里加滤波程序
imshow("Extracted frame",frame);
filter2D(frame,frame,-1,kernel);
imshow("after filter",frame);
cout<<"正在读取第"<<currentFrame<<"帧"<<endl;
//waitKey(int delay=0)当delay ≤ 0时会永远等待;当delay>0时会等待delay毫秒
//当时间结束前没有按键按下时,返回值为-1;否则返回按键
int c = waitKey(delay);
//按下ESC或者到达指定的结束帧后退出读取视频
if((char) c == 27 || currentFrame > frameToStop)
{
stop = true;
}
//按下按键后会停留在当前帧,等待下一次按键
if( c >= 0)
{
waitKey(0);
}
currentFrame++;
}
//关闭视频文件
capture.release();
waitKey(0);
return 0;
}