OpenCV--012:视频读写

视频处理的是运动图像,而不是静止图像。视频资源可以是一个专用摄像机、网络摄像头、视频文件或图像文件序列。

在 OpenCV 中,VideoCapture 类和 VideoWriter 类为视频处理中所涉及的捕获和记录任务提供了一个易用的 C++API。

前面有提到OpenCV2和OpenCV3的视频读写:

opencv–读写视频



主要相关知识

  1. 什么是FOURCC
    FOURCC是“四字符代码”的缩写 - “四字符代码” - 媒体文件中使用的视频编解码器,压缩格式,颜色或像素格式的标识符

    FOURCC总是在文件中占用32位/ 4字节。

    写FOURCC的另一种方法是4CC(4,如“四”字符代码)。

    FOURCC中的四个字符通常限制在ASCII表中的人类可读字符内。因此,很容易传达和传达FOURCC在媒体文件中的内容。

    AVI文件是最广泛使用或第一种广泛使用的媒体文件格式,它使用FOURCC标识符来编写用于压缩文件中各种视频/音频流的编解码器

    一些比较知名的FOURCC包括“DIVX”,“XVID”,“H264”,“DX50”。但这些仅仅是数百种中的一小部分。

  2. VideoWriter构造函数

    VideoWriter(const String& filename, 
                int fourcc, double fps,
                Size frameSize, bool isColor = true);
    
    VideoWriter(const String& filename,
                int apiPreference, int fourcc, double fps,
                Size frameSize, bool isColor = true)
    filename:存放写入视频的路径
    apiPreference: 
    fourcc:代表了所使用的编码方式。
    fps:每秒写入帧数,被创建视频流的帧率
    frameSize:写入视频文件的宽和高。
    isColor:若非零,编码器希望得到彩色帧并进行编码;否则,是灰度帧。(只有在Windows下支持这个标志)
    
    fourcc部分参数:
    CV_FOURCC('P','I','M','1') = MPEG-1 codec
    CV_FOURCC('M','J','P','G') = motion-jpeg codec
    CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
    CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
    CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
    CV_FOURCC('U', '2', '6', '3') = H263 codec
    CV_FOURCC('I', '2', '6', '3') = H263I codec
    CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
    




视频读写

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

using namespace std;
using namespace cv;

int main() {
	//存放读取的每一帧和被转化后的每一帧
	Mat in_f, out_f;

	//打开自带摄像头
	VideoCapture readCapture(0);
	//判断摄像头是否打开成功
	if (!readCapture.isOpened()) {
		cout << "摄像头打开错误!" << endl;
		return -1;
	}

	//获取读入视频文件的高度和宽度
	int width=(int)readCapture.get(CAP_PROP_FRAME_WIDTH);
	int height=(int)readCapture.get(CAP_PROP_FRAME_HEIGHT);

	//定义存放读取视频的地址
	char myVideo[] = "D:/test/myVideo3.avi";
	//定义每一秒读取的帧数
	double fps = 30;

	//按照规定的帧数写入读取的视频文件


	//当存入视频为灰度色彩时,isColor必须设置为0
	//否则,不需要写最后一个参数,否则会出现问题。
	VideoWriter writerCapture(myVideo,VideoWriter::fourcc('X', 'V', 'I', 'D'),fps,Size(width,height),0);
	if (!writerCapture.isOpened()) {
		cout << "写入视频错误" << endl;
		return -1;
	}
	
	//显示摄像头读取的视频和转换成灰度空间的视频文件
	while (true)
	{
		//从摄像机读取帧(抓取并解码)
		readCapture >> in_f;
		//将帧转换为灰度
		cvtColor(in_f, out_f, COLOR_BGR2GRAY);
		//将幀写入视频文件(编码并保存)
		writerCapture << out_f;
		imshow("read", in_f);
		imshow("write", out_f);
		if (waitKey(1000 / fps) >= 0) {
			break;
		}
	}
	readCapture.release();
	return 0;
}

灰度视频和彩色视频:
在这里插入图片描述



可能遇到的问题:

  1. 打不开视频或摄像头
    ①.本地视频的输入路径有问题,例如下面所示:

    string outputVideoPath = "D:\test\3.avi";
    

    上述方式会因为转义符而出现问题。

    正确的路径命名方式为:
    string outputVideoPath = "D:\\test\\3.avi";
    string outputVideoPath = "D:/test/3.avi";
    

    ②.摄像头前几帧出现空帧
    解决办法:多次加载视频,readCapture>>in_f 直至图像不为空。

  2. 保存文件为空

    可能是后缀名的问题,尝试使用.avi。

  3. 保存文件打不开

    可能是帧率及图像宽高设置有误。

学习:
VideoWriter的用法
opencv笔记(三十三)——Video Capture使用示例。读取视频
OpenCV读取和写入视频文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值