文章目录
视频读取 cv::VideoCapture
方式一:从视频文件读取
cv::VideoCapture capture(
const string& filename, // 输入文件名
);
对象创建以后,OpenCV将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。
方式二:从视频设备获取
cv::VideoCapture capture(
int device // 视频捕捉设备 id
);
是从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。
对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。
方式三:通过成员函数open()来设定打开的信息
cv::VideoCapture cap;
cap.open( "my_video.avi" );
视频帧读取到Mat
cv::Mat frame;
cap.read(frame); //读取方式一
cap >> frame; //读取方式二
视频的写操作cv::VideoWriter
创建对象
方式一:构造函数的方式
cv::VideoWriter out(
const string& filename, // 输入文件名
int fourcc, // 编码形式,使用 CV_FOURCC()宏
double fps, // 输出视频帧率
cv::Size frame_size, // 单帧图片的大小
bool is_color = true // 如果是false,可传入灰度图像
);
方式二:open()函数
cv::VideoWriter out;
out.open(
"my_video.mpg", //输出文件名
CV_FOURCC('D','I','V','X'), // MPEG-4 编码
30.0, // 帧率 (FPS)
cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
true // 只输入彩色图
);
写入图像
方式一:write()
cv::VideoWriter::write(
const Mat& image // 写入图像作为下一帧
);
方式二: <<
my_video_writer << my_frame;
DEMO
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
cv::VideoCapture cap(0);
if (!cap.isOpened())
{
printf("open video failed!\n");
return 1;
}
cv::Mat Frame;
//设置保存的视频帧数目
int frameNum = 1000;
//保存视频的路径
string outputVideoPath = "..\\test.avi";
//获取当前摄像头的视频信息
cv::Size sWH = cv::Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),(int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));
cout << "width :" << (int)cap.get(CV_CAP_PROP_FRAME_WIDTH) << "----" << "height :" << (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT) << endl;
cv::VideoWriter outputVideo;
outputVideo.open(outputVideoPath, -1/*CV_FOURCC('M', 'P', '4', '2')*/, 25.0, sWH);
while (cap.isOpened() && frameNum > 0)
{
cap >> Frame;
if (Frame.empty()) break;
outputVideo << Frame;
frameNum--;
imshow("img", Frame);
//cv::waitKey(10);
if (char(cv::waitKey(30)) == 'q') break;
}
outputVideo.release();
system("pause");
}