OpenCv编码和视频编码基础

OpenCV(Open Source Computer Vision Library)编码库:

OpenCv是一个开源的计算机视觉库,提供了丰富的图像和视频处理功能。在使用 OpenCV 进行图像编码时,可以使用以下几种常见的编码格式:

  1. JPEG 编码(Joint Photographic Experts Group):JPEG 是一种广泛用于图像压缩的有损压缩方法,能够在一定程度上减小图像文件的大小并保持可接受的视觉质量,在 OpenCV 中,可以使用 imwrite() 函数将图像以 JPEG 格式进行编码保存:

cv::imwrite("image.jpg", image);

  1. PNG编码(Portable Network Graphics):PNG是一种无损压缩的图像格式,能够保持图像的高质量细节,并支持透明度,在OpenCv中,可以使用imwrite()函数将图像以PNG格式进行编码保存:

cv::imwrite("image.png", image);

  1. BMP编码(Bitmap):BMP是一种简单的位图图像格式,文件体积较大但是没有任何压缩,保留了图像的原始数据,在 OpenCV 中,可以使用 imwrite() 函数将图像以 BMP格式进行编码保存:

cv::imwrite("image.bmp", image);

  1. TIFF编码(Tagged Image File Format):TIFF是一种灵活的图像格式,支持多种压缩方式和色彩空间,并能够保存多个图像及其相关信息,在 OpenCV 中,可以使用 imwrite() 函数将图像以 TIFF格式进行编码保存:

cv::imwrite("image.tiff", image);

以上是一些常见的图像编码格式示例,OpenCv还支持其他格式的图像编码,具体可以根据实际需求进行选择和使用。

视频编码基础:

视频编码是将视频信号进行压缩和编码的过程,以减小视频文件的大小并提供适当的传输和存储方式。视频编码的基础包括以下几个主要方面:

1. 帧间压缩(Inter-frame Compression):视频编码利用帧间压缩技术来减少视频文件大小。该方法通过在连续的视频帧之间寻找相似之处并仅编码差异来实现压缩。常见的帧间压缩算法包括运动估计和补偿。

2. 运动估计与补偿(Motion Estimation and Compensation):运动估计与补偿是视频编码中的一项关键技术。它通过分析连续帧之间像素的变化来确定物体的运动,并对运动部分进行编码。运动估计用于预测当前帧中的像素位置,而运动补偿用于根据先前帧的信息生成预测残差。

3. 空域压缩(Spatial Compression):空域压缩是指对图像中的单个帧进行压缩,而不考虑与其他帧之间的关系。空域压缩使用各种编码算法来减少冗余数据,如离散余弦变换(Discrete Cosine Transform,DCT)、波尔基变换和量化。

4. 时域压缩(Temporal Compression):时域压缩是指对连续帧之间的差异进行编码。它利用一系列技术,如帧间预测和运动补偿,通过存储差异帧而不是完整的视频帧来实现压缩。这种方法在压缩过程中利用了时间方向上的冗余性。

编码标准:视频编码还涉及各种编码标准,如H.264/AVC、H.265/HEVC、VP9和AV1等。这些标准规定了视频编码的算法和流程,以确保不同设备和平台之间的互操作性。通过应用这些基础概念和技术,视频编码能够在保持较高视觉质量的同时减小视频文件的大小,从而更好地适应传输、存储和分享的需求。

在视频压缩编码中,会将每一帧编码成I帧、P帧或者B帧:

* I帧:

I帧又称为内编码帧是一种自带全部信息的独立帧,无需参考其他图像就可以独立进行解码,即全部为帧内编码;可以简单的理解为一张静态的画面。视频序列中的第一个帧始终都是I帧,因为它是关键帧。如果传输过程中I帧丢失,画面最直接的反应就是会卡顿,因为后面的帧都无法得到正确的解码,只能等待下一个GOP(Group of picture:图像组,指两个I帧之间的距离,而两个P帧之间的距离叫做参考周期(Reference),一个I帧所占用的字节大于一个P帧,一个P帧占用的字节大于一个B)。

* IDR帧:

IDR帧又称及时解码刷新,其实就是I帧,不过它是第一个I帧或者是强制I帧,它的作用就是立即刷新,使错误不进行传播;从IDR帧开始,重新算一个新的序列开始编码。IDR帧会导致参考序列表(DPB)清空,而I帧不会,所以:IDR帧一定是I帧,而I帧不一定是IDR。一个图像序列中可以有很多个I帧,一个I帧后的图像可以引用I帧之间的图像做运动参考,但是对于IDR帧来说,IDR帧之后的图像不能引用IDR之前的帧内容,因为从IDR帧相当于重新开始。

* P帧:

P帧又称帧间预测编码帧需要参考前面的I帧才能进行编码表示的是当前帧画面与前一帧(前一帧有可能是P帧也可能是I帧)的差别。解码时需要用之前缓存的画面叠加上本帧定义的差别来生成最终画面。与I帧相比P帧通常占用更少的数据位,但是不足的是P帧对前面的P帧或I帧有着复杂的依赖性,因此对传输错误非常敏感,如果P帧丢失,画面会出现马赛克的现象,因为前向参考帧错误,补齐的并不是真正运动变化后的数据。

* B帧:

B帧又称双向预测编码帧也就是说B帧记录的是本帧与前后帧的差别。也就是说要解码B帧,不仅需要取得之前的缓存画面还要解码之后的画面,通过前后画面与本帧数据叠加取得最终的画面。B帧的压缩率较高,但是对于解码性能要求也较高,如果视频中没有B帧,解码的顺序与显示顺序相同,但如果视频中有B帧,解码顺序和实现序列不同,解码输出显示前需要进行图像重排列。目前接触到的一般都是I帧+P帧。

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倔强de番茄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值