C++ opencv视频处理与保存
C++ opencv视频处理与保存
1.视频属性类型
视频有很多的属性,有时长,分辨率,帧宽度,帧高度,帧速率等
视频属性中,由于国内互联网视频网站的定义,我们对分辨率的区分有些误区。
所以这里重新介绍一下视频的分辨率,至于其他属性,一般不会有什么误区。
-
分辨率
通常国际标准,我们把视频分辨率分为三类
SD—— 标清
HD——高清
UD——超高清
简要介绍如下:
标清(Standard Definition)
是物理分辨率在720p以下的一种视频格式。
高清(High Definition)
将“高清”定义为720p、1080i与1080p三种标准形式
而1080P又有另外一种称呼—全高清(FullHigh Definition)。
关于高清标准,国际上公认的有两条:视频垂直分辨率超过720p或1080i
视频宽纵比为16:9。
超高清(Ultra High-Definition)
来自国际电信联盟 (International Telecommunication Union)最新批准的信息显示,
“4K分辨率 (3840×2160 像素)” 的正式名称被定为“超高清 Ultra HD(UltraHigh-Definition)”。
同时,这个名称也适用于“8K分辨率 (7680×4320像素)”。CEA要求,所有的消费级显示器和电视机必须满足以下几个条件之后,才能 贴上“超高清 Ultra HD” 的标签:
首先屏幕最小的像素必须达到800 万有效像素(3840×2160)
在不改变屏幕分辨率的情况下,至少有一路传输端可以传输 4K视频,4K内容的显示必须原生,
不可上变频,纵横比至少为16:9。
Ps:720p格式,分辨率为1280×720p/60Hz,行频为45kHz 。
4K分辨率是1080p的4倍 3840×2160 =1920×2×1080×2 。
8K分辨率是4K的4倍 7680×4320 = 3840×2×2160×2
-
帧
虽然介绍了分辨率,但本文主要演示一些帧相关的属性,具体如下
- 帧宽度——frame_width
- 帧高度——frame_height
- 总帧数——frame_count
- 帧速率—— FPS(Frames Per Second)
2.视频属性获取
在opencv中,我们如果要获取视频的属性,就要用到VideoCapture类的一个方法
.get
get返回指定VideoCapture属性共1个参数第1个参数 指定的属性
VideoCapture属性,有很多很多,具体可查阅文档
本文只用到4种属性
CAP_PROP_FRAME_WIDTH - 视频流中帧的宽度
CAP_PROP_FRAME_HEIGHT - 视频流中帧的高度
CAP_PROP_FRAME_COUNT - 视频文件中的帧数
CAP_PROP_FPS - 帧率
实例代码
获取视频属性
void QuickDemo::video_demo(Mat& image) {VideoCapture cap("D:/WorkSpace/Opencv/videos/mouse.mp4");//读取视频文件int frame_width = cap.get(CAP_PROP_FRAME_WIDTH);int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT);int frame_count = cap.get(CAP_PROP_FRAME_COUNT);double fps = cap.get(CAP_PROP_FPS);std::cout << "frame_width:" << frame_width << std::endl;std::cout << "frame_height:" << frame_height << std::endl;std::cout << "frame_count:" << frame_count << std::endl;std::cout << "fps:" << fps << std::endl;Mat frame;while (true) {cap.read(frame);//frame为输出,read是将捕获到的视频一帧一帧的传入frame//对视频读取时,同图像一样会有判空操作if (frame.empty()) {break;}imshow("frame", frame);int c = waitKey(1);if (c == 27) {break;}}cap.release();
}
注:
这里有一点要提
既然有get,那就有对应的set。但是我们使用set会涉及很多的问题
比如上一课中摄像头
当我们使用set对摄像头传来的视频操作时
如果超出了摄像头硬件的范围,即使设置的再好也不会显示
3.视频保存
在opencv中,关于视频的写操作是通过VideoWriter类来实现的。
在进行图像保存的时候,我们一般要三步
- 通过 VideoWriter创建一个视频写入对象。(创建时,我们要传入各种写入要求)
- 再通过writer写入。
- 释放
API
VideoWriter 类
- fourcc 指定编码器(cv2.VideoWriter_fourcc(*'mp4v')XVID:avi的
VideoWriter (const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)视频写入对象共5个参数第1个参数 视频文件路径第2个参数 视频编码方式(我们可以通过VideoCapture::get(CAP_PROP_FOURCC)获得)第3个参数 fps第4个参数 size第5个参数 是否为彩色
write
write写入下一个视频帧共1个参数第1个参数 输入的视频帧
这里提一句(对象都要释放)
同VideoCapture类对象一样,VideoWirter对象也要在末尾写上release
演示如下
示例代码
视频保存
void QuickDemo::video_demo(Mat& image) {VideoCapture cap("D:/WorkSpace/Opencv/videos/mouse.mp4");//读取视频文件int frame_width = cap.get(CAP_PROP_FRAME_WIDTH);int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT);int frame_count = cap.get(CAP_PROP_FRAME_COUNT);double fps = cap.get(CAP_PROP_FPS);std::cout << "frame_width:" << frame_width << std::endl;std::cout << "frame_height:" << frame_height << std::endl;std::cout << "frame_count:" << frame_count << std::endl;std::cout << "fps:" << fps << std::endl;VideoWriter wri("D:/WorkSpace/Opencv/videos/wri.mp4", cap.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);Mat frame;while (true) {cap.read(frame);//frame为输出,read是将捕获到的视频一帧一帧的传入frame//对视频读取时,同图像一样会有判空操作if (frame.empty()) {break;}wri.write(frame);imshow("frame", frame);int c = waitKey(1);if (c == 27) {break;}}cap.release();wri.release();}
视频处理注意事项
最后有两点要提
- opencv,只专注于视频画面的处理,没有声音,不处理音频,如果想处理音频,要涉及其他领域
- opencv保存视频是有一定限制的,理论上说单个视频不要超过2G
- Oracle中rowid的用法(全面)
- html5 tooltip,HTML5 教程之CSS 提示工具(Tooltip)
- 简略写dump文件
- Win7 64位中MinGW和MSYS的安装
- skip connections
- 动态改变shiro的Principal属性
- Gallery3D
- gallery3D(3)
- Android 真正的3D Gallery
- SOA教程之:SOA的优点和缺点
- vss使用说明!!
- Linux中EXT3与EXT4的区别!
- MFC 的CList,CPtrList,CObList,CStringList 的用法之CList
- 在Python中,可以使用try
- int.TryParse 方法
- linux curl命令详解,以及实例
- 【Spring Boot JPA】ManyToOne OneToMany学习笔记
- lssvm实例
- 家族关系查询系统程序设计算法思路
- Qt数据库:(五)QSqlQueryModel