HEVC代码学习18:运动估计和运动补偿总结
经过了这段时间对帧间预测部分代码的学习,算是大体上了解了其工作原理。只看理论不看代码,体会不深刻,在看了代码后,有了一种恍然大悟的感觉,很多算法实现和看原理时理解的不一样。下面来整理一下之前写的博客,总结一下运动估计和运动补偿具体的代码实现思路,主要谈一下代码处理的思路,
运动估计
运动估计实际就是当前块在参考图像中搜索找到匹配块的处理过程。在实际代码中入口函数是xMotionEstimation
,然后分为整像素搜索xPatternSearch
,xPatternSearchFast
和亚像素搜索xPatternSearchFracDIF
。
详见http://blog.csdn.net/lin453701006/article/details/70860150。
整体思路:整像素搜索后会得到一个整像素单位的最优MV,这个MV值作为新的起始点进行亚像素搜索。亚像素搜索中先后又进行了1/2像素搜索,找到1/2像素单位的最优MV作为起始点,进行1/4像素搜索,最终得到了1/4像素单位的最优MV。最终得到的有用数据是1/4像素单位的MV和对应的参考帧索引。
在搜索中,由于亚像素位置是没有值的,因此就需要对参考图像进行插值,得到了整像素、1/2、1/4像素位置的图像,存放在了m_filteredBlock[4][4]
中。
详见http://blog.csdn.net/lin453701006/article/details/73188458
整个搜索过程是个逐步找最优的过程。
整像素搜索的入口函数是xPatternSearch
和xPatternSearchFast
。xPatternSearch
进行的是全局搜索,xPatternSearchFast
进行的是快速算法,一般情况下使用的是xPatternSearchFast
。
详见http://blog.csdn.net/lin453701006/article/details/70860150
xPatternSearchFast
将会使用TZ search,进行菱形搜素搜索,得到一个最优的整像素MV。
详见http://blog.csdn.net/lin453701006/article/details/77089786
亚像素搜索的入口函数是xPatternSearchFracDIF
,可以分为插值和搜索两个部分。插值分为1/2像素插值xExtDIFUpSamplingH
和1/4像素插值xExtDIFUpSamplingQ
,使用插值滤波器得到亚像素位置的参考块。xPatternRefinement
是在以前一步得到的最优MV指向的像素为中心的3x3的像素块中,搜索计算RD cost,找最优匹配块,进一步计算最优MV。
详见http://blog.csdn.net/lin453701006/article/details/70156817。
运动补偿
在运动估计之后,得到的是MV和参考帧索引,运动补偿就是通过这些信息来构造预测图像,实际代码中,运动补偿主要进行亚像素位置插值补偿,生成预测图像。运动补偿的入口函数为motionCompensation
,其中分为单向预测xPredInterUni
、双向预测xPredInterBi
和加权预测xWeightedPredictionUni
,xWeightedPredictionBi
。
详见http://blog.csdn.net/lin453701006/article/details/72677630。
HEVC代码学习18:运动估计和运动补偿总结相关推荐
- HEVC代码学习:帧间预测——MVP过程中MV的获取、传递及存储
作为一个视频编码小白,最近开始着手啃HEVC帧间预测的代码,想用博客记录一下自己的学习过程,也想与大家分享.交流一下. HEVC代码的学习主要是参考两位大神岳麓吹雪.NB_vol_1的博客以及HM参考 ...
- HEVC代码学习——帧间预测:预测MV获取(xEstimateMvPredAMVP、fillMVPCand)
HEVC帧间预测在AMVP模式下是依靠xEstimateMvPredAMVP函数获取预测MV(MVP)的. 这部分内容的学习还可以参考这两篇博客: HEVC代码学习15:AMVP相关函数 HM编码器代 ...
- HEVC代码学习42:estIntraPredLumaQT函数
在之前的 HEVC代码学习37:帧内预测代码整体学习 中已经提到,estIntraPredLumaQT是亮度帧内预测的入口函数,下面将对该函数进行详细学习. estIntraPredLumaQT中完成 ...
- HEVC代码学习39:decodeCtu和xDecodeCU函数
在之前 HEVC代码学习38:decompressSlice函数 学习中提到,解码slice会遍历所有CTU,调用decodeCtu和decompressCtu解码每一个CTU.下面就来学习一下dec ...
- HEVC代码学习13:predInterSearch函数
在上一章的xCheckRDCostInter学习中,我们知道了,进行帧间搜索的入口实际是predInterSearch,今天我们就来对他进行学习. 推荐看大神博客 http://blog.csdn.n ...
- HEVC代码学习15:AMVP相关函数
在HEVC中,使用了AMVP技术,利用空域和时域上的运动向量的相关性,为当前PU建立候选预测MV(MVP)列表.编码器从中选出最优的预测MV,并对MV进行差分编码:解码端会构造相同的列表,仅需要运动向 ...
- HEVC代码学习19:MV、MVD、MVP概念解析
在代码阅读中,可以看到MV.MVD.MVP三个概念,在开始学习的时候就很糊涂,一直买具体来看下,也找不到具体在哪里有讲解,现在来关注学习一下. 先来逗比一下,名词解析: MVP--most valua ...
- HEVC代码学习6:filterHor和filterVer函数
帧间预测分为运动估计ME和运动补偿MV,其中用到了MV的亚像素搜索,需要使用filterHor和filterVer进行插值. 这里使用的是HM16,在之前版本中分为filterHorLuma.filt ...
- HEVC代码学习27:calcRdCost函数
之前在率失真代价TComRdCost类中提到,计算率失真代价的函数为:calcRdCost,下面就来学习一下. calcRdCost工作流程如下: 1.根据输入的失真类型eDFunc来设置λ. 2.根 ...
最新文章
- 1.MySQL基本体系
- 具有实际意义的5种云遣返
- (51)SSDT HOOK 实现进程保护
- 背景虚化_一分钟学会背景虚化,掌握3个关键就能拍出好照片
- gitkraen_超详细!Github团队协作教程(Gitkraken版)
- php用script判断闰年,php判断/计算闰年的方法小结【三种方法】
- 类的继承python 简明_[简明python教程]学习笔记2014-05-04
- 教你做前端表单文本框必填
- 如何在六个月或更短的时间内成为DevOps工程师(一)
- 关于pytorch里面的图像变换
- [转载]url带中文参数显示乱码的问题
- 利用apache的ab命令做服务器压力测试
- SVN自助更新:运维利器Puppet实例讲解
- 玩转Heartbeat,快速实现高可用性集群
- JavaScript学习笔记(四)
- Python数据结构之字节,字节数组
- ImageJ工具使用简介
- COPRA RF 2005 SR1冷弯成型,轧辊设计 USB加密锁
- android自动对焦第一次对焦,Android自定义相机实现自动对焦和手动对焦
- Linux配置Samba实现局域网共享文件夹
热门文章
- 5.代码C语言程序设计
- 2022年中国春节档电影观影人次、票房收入及票价走势分析[图]
- 小米抢注mi.io域名 “雷布斯”要做小米小程序?
- maven使用,Nexus配置阿里云代理仓库,三方仓库,本地仓库
- office2016安装记录
- 预测2019浙大计算机考研分数,2019年浙江大学考研复试分数线已出现
- 恐怖绝伦,SOPA和PIPA捅了网站窝
- 亚马逊要求化妆品提交HRIPT / RIPT测试报告和COA证书详情解析
- Numeric Keypad
- windows安装CUDA11.1,搭建PaddlePaddle和PaddleHub