H.264运动补偿(Motion Compensation)概念(块匹配、运动矢量和残差编码、块划分和运动估计)(运动估计算法:全搜索、钻石搜索、六边形搜索)

文章目录

  • H.264 运动补偿概念
    • 引言
    • I. 运动补偿基本原理
      • 1.1 运动预测
      • 1.2 帧类型
      • 1.3 块匹配
    • II. 运动矢量和残差编码
      • 2.1 运动矢量
      • 2.2 残差编码
    • III. H.264 运动补偿技术难点
      • 3.1 块划分和运动估计
      • 3.2 残差编码
      • 3.3 B帧的预测
    • IV. H.264 运动补偿实现
      • 4.1 帧划分与运动估计
      • 4.2 残差编码
    • V. 总结

H.264 运动补偿概念

引言

在视频编码中,减少冗余信息是提高编码效率的关键。这种冗余信息包括空间冗余(同一帧内部的冗余)和时间冗余(相邻帧之间的冗余)。运动补偿就是为了消除这种时间冗余。

H.264 是一种广泛使用的视频压缩标准,其在高效率、高质量的视频压缩方面有着显著的优势。运动补偿是 H.264 标准中一个重要的技术特性,用于在连续的视频帧之间识别并删除冗余信息。


I. 运动补偿基本原理

1.1 运动预测

H.264 的运动补偿建立在所谓的"运动预测"上。这个原理基于一个观察:在许多视频场景中,连续的画面之间通常只存在微小的变化。这些变化可以通过记录某物体在两个画面之间的移动来简单描述,这就是运动预测。

1.2 帧类型

在 H.264 中,根据运动预测的不同,我们可以将视频帧划分为三种类型:I帧(Intra-coded frame)、P帧(Predicted frame)和B帧(Bi-predictive frame)。I帧是自我完整的帧,不依赖任何其他帧。而 P帧和 B帧则需要依赖其他帧(通常是前一帧或后一帧)进行解码。

1.3 块匹配

运动补偿是通过块匹配实现的。H.264 将每一帧划分为许多固定大小的块,然后在参考帧中寻找与当前块最相似的区域,该过程称为块匹配。通过存储这种匹配关系,我们可以用较少的数据表示原视频。


II. 运动矢量和残差编码

2.1 运动矢量

运动矢量是描述一个块从当前位置到参考帧位置的向量。这个概念被用来记录并预测物体的运动。

2.2 残差编码

尽管运动矢量可以大致描述一个块的变化,但仍有可能出现一些误差。这些误差就叫做"残差"。为了进一步提高压缩效率,H.264 引入了残差编码。这是一个将残差转化为可传输数据的过程,它可以更准确地记录帧间的差异。


III. H.264 运动补偿技术难点

3.1 块划分和运动估计

块的大小和形状对于运动补偿的效果有重要影响。H.264 标准支持多种块大小,这大大提高了编码的灵活性和效率。但同时,如何选择合适的块大小以及如何准确地估计运动也变得更加困难。

3.2 残差编码

虽然残差编码可以提高压缩效率,但如何有效地进行残差编码仍是一个挑战。特别是在快速、复杂的视频场景中,残差编码需要处理大量的数据,这可能会导致编解码过程变得复杂和耗时。

3.3 B帧的预测

与 I帧和 P帧相比,B帧的预测更为复杂。因为 B帧不仅可以引用前一帧,还可以引用后一帧,甚至可以同时引用前后两帧。这就使得 B帧的预测变得更加困难,同时也增加了编解码的复杂性。


IV. H.264 运动补偿实现

4.1 帧划分与运动估计

H.264标准支持多种块的大小和形状,最大可以达到16x16像素,最小可以到4x4像素。这提供了很高的灵活性,但同时也增加了运动估计的复杂度。一般来说,对于静态或慢速移动的区域,使用较大的块进行运动估计会有更好的效果;而对于快速移动的区域,则需要使用较小的块。

具体的运动估计算法有很多种,如全搜索、钻石搜索、六边形搜索等。这些算法的目标都是找到与当前块最匹配的参考块,并计算出相应的运动矢量。

void motion_estimation(AVFrame *cur_frame, AVFrame *ref_frame, int mb_size) {int mb_x, mb_y;for (mb_y = 0; mb_y < cur_frame->height; mb_y += mb_size) {for (mb_x = 0; mb_x < cur_frame->width; mb_x += mb_size) {int dx, dy;block_matching(cur_frame, ref_frame, mb_x, mb_y, mb_size, &dx, &dy);// 存储运动矢量(dx, dy)}}
}

4.2 残差编码

残差编码的目标是将运动补偿后的误差(即残差)进行编码。H.264使用了一种名为变换编码的方法来实现这个目标。首先,对残差块进行离散余弦变换(DCT),然后对变换后的系数进行量化、扫描和熵编码。

void residual_coding(AVFrame *cur_frame, AVFrame *ref_frame, int mb_size) {int mb_x, mb_y;for (mb_y = 0; mb_y < cur_frame->height; mb_y += mb_size) {for (mb_x = 0; mb_x < cur_frame->width; mb_x += mb_size) {// 计算残差int residual[mb_size][mb_size];compute_residual(cur_frame, ref_frame, mb_x, mb_y, mb_size, residual);// 对残差进行DCT变换、量化和熵编码transform_and_encode(residual, mb_size);}}
}

V. 总结

H.264通过运动补偿技术有效地消除了视频帧之间的冗余信息,从而达到了高效的视频压缩效果。但与此同时,运动估计、残差编码等步骤也带来了一定的挑战。尽管如此,H.264依然是目前最广泛使用的视频压缩标准之一,其高效的压缩性能和灵活的编码选项使得它在各种应用场景中都有着广泛的应用。

ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍
ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ        ‌‍ᅟᅠ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter 压测 —— 非GUI模式执行实例!

1、上传脚本 把在Windows下调试好的脚本上传的Linux系统/home目录下。 注意&#xff1a;只留测试脚本&#xff0c;屏蔽其它监控组件&#xff0c;比如&#xff1a;查看结果树、聚合报告、监听器等。 2、执行脚本 ①输入命令执行脚本 jmeter -n -t case.jmx -l case.jtl -n&…

Servlet技术之Cookie对象与HttpSession对象

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 Servlet技术之Cookie对象与HttpSession对象 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前…

神经网络:模型部署

【一】模型压缩的必要性与可行性&#xff1f; 模型压缩是指对算法模型进行精简&#xff0c;进而得到一个轻量且性能相当的小模型&#xff0c;压缩后的模型具有更小的结构和更少的参数&#xff0c;可以有效降低计算和存储开销&#xff0c;便于部署在端侧设备中。 随着AI技术的…

kubernetes(k8s)部署metrics及hpa-example示例

本例以kubernetes v1.26.0 为例&#xff0c;metrics-server版本为v.06.3&#xff0c;拉取源为阿里云提供 metrics yaml apiVersion: v1 kind: ServiceAccount metadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system --- apiVersion: rbac.auth…

LeetCode //C - 1493. Longest Subarray of 1‘s After Deleting One Element

1493. Longest Subarray of 1’s After Deleting One Element Given a binary array nums, you should delete one element from it. Return the size of the longest non-empty subarray containing only 1’s in the resulting array. Return 0 if there is no such subarr…

多组件卡片式问答引擎

#本篇文章联合同花顺人工智能领域开发者严同学创作 1.简介 为了满足用户个性化需求以及精细化运营&#xff0c;越来越多的企业推出多组件式的卡片问答&#xff0c;这种回答方式不会千篇一律&#xff0c;能够更好地为客户提供服务&#xff0c;帮助客户解决问题。 使用这种问答…

JAVA中的栈和堆

JAVA在程序运行时&#xff0c;在内存中划分5片空间进行数据的存储。分别是&#xff1a;1&#xff1a;寄存器。2&#xff1a;本地方法区。3&#xff1a;方法区。4&#xff1a;栈。5&#xff1a;堆。 基本&#xff0c;栈stack和堆heap这两个概念很重要&#xff0c;不了解清楚&…

从零实现一套低代码(保姆级教程) --- 【6】在项目中使用redux状态管理

摘要 在上一篇文章中的末尾&#xff0c;我们也完成了Input组件的属性面板配置。现在我们的低代码项目已经小有成就了。但是后面的内容还是不少的。 如果你是第一次看到这篇文章&#xff0c;那么请移步到第一节&#xff1a; 从零实现一套低代码&#xff08;保姆级教程&#xf…

防雷接地设备综合应用方案

防雷接地设备是一种用于保护建筑物、设备和人员免受雷电危害的设备。 防雷接地设备主要包括以下几种&#xff1a; 防雷针&#xff1a;防雷针是一种用于吸引雷电并将其导入地面的金属棒&#xff0c;通常安装在建筑物的最高点或其他易受雷击的位置。 防雷带&#xff1a;防雷带…

蓝桥1位运算

1.1 课程介绍_哔哩哔哩_bilibili &与 |或 ^异或 ~非 >>右移 <<左移 >>>0填充高位 >>符号位填充高位 用法&#xff1a;判断奇偶数 x&1 获取二进制位 交换两个整数的值 求绝对值 题1-1&#xff1a;如何找出数组中唯一成对的数 public static…

【论文笔记】BiFormer: Vision Transformer with Bi-Level Routing Attention

论文地址&#xff1a;BiFormer: Vision Transformer with Bi-Level Routing Attention 代码地址&#xff1a;https://github.com/rayleizhu/BiFormer vision transformer中Attention是极其重要的模块&#xff0c;但是它有着非常大的缺点&#xff1a;计算量太大。 BiFormer提…

Android 获取wlan0地址

要获取 Android 设备的 wlan0 接口的 IP 地址&#xff0c;可以使用以下代码&#xff1a; fun getIPAddress(interfaceName: String): String? {try {val interfaces: List<NetworkInterface> Collections.list(NetworkInterface.getNetworkInterfaces())for (intf in i…

Halcon颜色提取,基于MLP自动颜色提取功能

1.前言 在实际的图像处理中&#xff0c;经常会遇到彩色图像&#xff0c;使用彩色图像往往跟颜色识别有关系。但是使用RGB进行调参时又很难达到所需要的效果&#xff08;异常区域过多不好处理&#xff09;。 在Halcon中&#xff0c;halcon对颜色提取采用MLP&#xff08;多层感知…

Hive 部署

一、介绍 Apache Hive是一个分布式、容错的数据仓库系统&#xff0c;支持大规模的分析。Hive Metastore&#xff08;HMS&#xff09;提供了一个中央元数据存储库&#xff0c;可以轻松地进行分析&#xff0c;以做出明智的数据驱动决策&#xff0c;因此它是许多数据湖架构的关键组…

C/C++ 递增/递减运算符和指针

可以将递增运算符用于指针和基本变量。本书前面介绍过。将递增运算符用于指针时。将把指针的值增加其指向的数据类型占用的字节数&#xff0c;这种规则适用于对指针递增和递减。 double arr[5] {1.1, 2.1, 3.1, 4.1, 5.1}; double *ptr arr; ptr; 也可以结合使用这些运算符和…

PostgreSQL | 概念 | 什么是OLTPOLAP?

什么是OLTP&OLAP&#xff1f; 大白话理解&#xff1a;业务系统都可以称作OLTP&#xff0c;基于业务系统产生的数据进行数据分析和决策的都可以称为OLAP。 OLTP OLTP&#xff08; Online Transaction Processing&#xff09;在线事务处理系统 用途&#xff1a; 用于支持日…

14.Unity中序列化

非字符串类型转字节数组 //关键类&#xff1a;BitConverter//所在命名空间&#xff1a;System//主要作用&#xff1a;除字符串的其他常用类型和字节数组相互转换byte[] byte1 BitConverter.GetBytes(100); 字符串类型转字节数组 //关键类&#xff1a;Encoding//所在命名空间&…

第十部分 欧拉图与哈密顿图

欧拉图&#xff1a; 历史背景&#xff1a; 哥尼斯堡七桥问题与欧拉图 问题提出后&#xff0c;很多人对此很感兴趣&#xff0c;纷纷进行试验&#xff0c;但在相当长的时间里&#xff0c;始终未能解决。而利用普通数学知识&#xff0c;每座桥均走一次&#xff0c;那这七座桥所有的…

软件架构的演进过程

软件架构的发展经历了由单体架构、垂直架构、SOA架构到微服务架构的演进过程&#xff0c;下面我们分别了解一下这几个架构。 一, 单体架构 一个归档包&#xff08;例如war格式或者Jar格式&#xff09;包含了应用所有功能的应用程序&#xff0c;我们通常称之为单体应用。架构单…

共模电容:又一款EMC滤波神器?|深圳比创达电子(下)

一、共模电容 1、结构特性 图7 共模电容结构示意 如图7&#xff0c;共模电容是在普通叠层电容基础上&#xff0c;结合3端电容中为降低电容ESL的优化设计&#xff0c;添加了一组GND&#xff1b;同时这组GND还有一定的屏蔽作用&#xff0c;可降低电极的边缘辐射。 2、电气特性…