opencv 视频读写(c++)

视频读取 cv::VideoCapture

1. 从视频文件读取

cv::VideoCapture capture(
    const string& filename, // 输入文件名
);

对象创建以后,OpenCV将会打开文件并做好准备读取它,如果打开成功,我们将可以开始读取视频的帧,并且cv::VideoCapture的成员函数isOpened()将会返回true(建议在打开视频或摄像头时都使用该成员函数判断是否打开成功)。

2. 从视频设备获取

cv::VideoCapture capture(
	int device // 视频捕捉设备 id
);

是从摄像机中读取视频,这种情况下,我们会给出一个标识符,用于表示我们想要访问的摄像机,及其与操作系统的握手方式。
对于摄像机而言,这个标志符就是一个标志数字——如果只有1个摄像机,那么就是0,如果系统中有多个摄像机,那么只要将其向上增加即可。

3. 通过成员函数open()来设定打开的信息

cv::VideoCapture cap;
cap.open( "my_video.avi" );

4. 视频帧读取到Mat

cv::Mat frame;
cap.read(frame); 	//读取方式一
cap >> frame; 		//读取方式二

视频的写操作cv::VideoWriter

1. 创建对象

方式一:构造函数的方式
cv::VideoWriter out(
	const string& filename, // 输入文件名
	int fourcc, 			// 编码形式,使用 CV_FOURCC()宏
	double fps, 			// 输出视频帧率
	cv::Size frame_size, 	// 单帧图片的大小
	bool is_color = true 	// 如果是false,可传入灰度图像 
);
//常用编码形式:MJPG(.mp4),DIVX(.avi),X264(.mkv)
方式二: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    					// 只输入彩色图
);

2. 写入图像

方式一: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");
}

DEMO (opencv 4)

#include<iostream>
#include<opencv2/opencv.hpp>

int main() {

	cv::VideoCapture capture;
	//capture.open(0, cv::CAP_DSHOW);// 打开摄像头
	capture.open("./video/1.mp4");// 打开文件
	if (!capture.isOpened()) {
		printf("read video file failed !\n");
		return -1;
	}
	int type = static_cast<int>(capture.get(cv::CAP_PROP_FOURCC));
	cv::Size S = cv::Size((int)capture.get(cv::CAP_PROP_FRAME_WIDTH), (int)capture.get(cv::CAP_PROP_FRAME_HEIGHT));
	int fps = capture.get(cv::CAP_PROP_FPS);
	printf("FPS:  %d \n", fps);

	cv::VideoWriter out("./video/test.mp4", type, fps, S, true);

	cv::Mat frame;
	cv::namedWindow("src", cv::WINDOW_NORMAL);
	while (capture.read(frame)) {
		imshow("src", frame);
		out.write(frame);

		char c = cv::waitKey(50);
		//按 ESC 键退出播放
		if (c == 27) {
			break;
		}
	}
	capture.release();
	out.release();
	return 0;
}
#include "stdafx.h" #include"highgui.h" int main(int argc,char* argv[]) { cvNamedWindow( "avi"); CvCapture* capture = cvCreateFileCapture( "D:\\sample.avi"); IplImage* frame; while(1) { frame = cvQueryFrame(capture); if(!frame) break ; cvShowImage( "avi",frame); char c = cvWaitKey(33); if(c == 27) break; } cvReleaseCapture(&capture); cvDestroyWindow( "avi"); return 0; } 结构体 CvCapture CvCapture 是一个结构体,用来保存图像捕获所需要的信息。 opencv提供两种方式从外部捕获图像: 一种是从摄像头中, 一种是通过解码视频得到图像。 两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。 比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器类型,下一次如果要 获取将需要解码哪一帧等。 这些信息都保存在CvCapture结构中,每获取一帧后,这些信息 都将被更新,获取下一帧需要将新信息传给获取的 api接口 cvCreateFileCapture(char*name) 通过输入要读取的avi文件的路径,然后,该函数返回一个指向 CvCapture结构体的指针。 cvQueryFrame(capture) 输入一个CvCapture 类型的指针,该函数主要功能是将视频文件的下一帧加载到内存。与 cvLoadImage的不同之处是,该函数不重新分配内存空间。 C=cvWaitKey(33) 当前帧被显示后,等待 33毫秒。如果用户触发了一个按键, c会被设置成这个按键的 ASCII码,否则会被设置成 -1。 cvWaitKey(33) 在此处的另外一个作用是,控制帧率。 cvReleaseCapture(&capture) 释放为 CvCapture结构体开辟的内存空间 关闭打开的 AVI文件相关的文件句柄 读取摄像头 只需把 cvCreateFileCapture 改成cvCreateCameraCapture即可。 该函数的输入参数是一个 ID号,只有存在多个摄像头时才起作用。当 ID=-1时,表示 随机选择一个。 HighGUI做了很多工作,使得摄像机图像序列像一个视频文件一样。 cvCreateFileCapture返回空的问题 ( 1)视频文件路径没对( 2)没有安装解码器( 3)如果使用的是 Opencv2.0或更高版本,那么,能否正确加载 opencv_ffmpeg210.dll( 4)尽管是 AVI文件,但也可能使用了某种 codec,例如 :MJPEG Decompressor。 需要把它转换 OpenCV支持的 AVI文件 . OpenCV支持的AVI。例如使用狸窝全能视频转换器,在《预置方案》处,选择 AVI-Audio_Video Interleaved(*.avi)。或者使用格式工厂也可以。( 5)读摄像头数据,需要安装与摄像头相应的驱动程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值