opencv 视频读写

视频读取 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");
}
原创文章 29 获赞 111 访问量 139万+

猜你喜欢

转载自blog.csdn.net/liang_baikai/article/details/101055325