经过了这段时间对帧间预测部分代码的学习,算是大体上了解了其工作原理。只看理论不看代码,体会不深刻,在看了代码后,有了一种恍然大悟的感觉,很多算法实现和看原理时理解的不一样。下面来整理一下之前写的博客,总结一下运动估计和运动补偿具体的代码实现思路,主要谈一下代码处理的思路,

运动估计

运动估计实际就是当前块在参考图像中搜索找到匹配块的处理过程。在实际代码中入口函数是xMotionEstimation,然后分为整像素搜索xPatternSearchxPatternSearchFast和亚像素搜索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

整个搜索过程是个逐步找最优的过程。

整像素搜索的入口函数是xPatternSearchxPatternSearchFastxPatternSearch进行的是全局搜索,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和加权预测xWeightedPredictionUnixWeightedPredictionBi
详见http://blog.csdn.net/lin453701006/article/details/72677630。

HEVC代码学习18:运动估计和运动补偿总结相关推荐

  1. HEVC代码学习:帧间预测——MVP过程中MV的获取、传递及存储

    作为一个视频编码小白,最近开始着手啃HEVC帧间预测的代码,想用博客记录一下自己的学习过程,也想与大家分享.交流一下. HEVC代码的学习主要是参考两位大神岳麓吹雪.NB_vol_1的博客以及HM参考 ...

  2. HEVC代码学习——帧间预测:预测MV获取(xEstimateMvPredAMVP、fillMVPCand)

    HEVC帧间预测在AMVP模式下是依靠xEstimateMvPredAMVP函数获取预测MV(MVP)的. 这部分内容的学习还可以参考这两篇博客: HEVC代码学习15:AMVP相关函数 HM编码器代 ...

  3. HEVC代码学习42:estIntraPredLumaQT函数

    在之前的 HEVC代码学习37:帧内预测代码整体学习 中已经提到,estIntraPredLumaQT是亮度帧内预测的入口函数,下面将对该函数进行详细学习. estIntraPredLumaQT中完成 ...

  4. HEVC代码学习39:decodeCtu和xDecodeCU函数

    在之前 HEVC代码学习38:decompressSlice函数 学习中提到,解码slice会遍历所有CTU,调用decodeCtu和decompressCtu解码每一个CTU.下面就来学习一下dec ...

  5. HEVC代码学习13:predInterSearch函数

    在上一章的xCheckRDCostInter学习中,我们知道了,进行帧间搜索的入口实际是predInterSearch,今天我们就来对他进行学习. 推荐看大神博客 http://blog.csdn.n ...

  6. HEVC代码学习15:AMVP相关函数

    在HEVC中,使用了AMVP技术,利用空域和时域上的运动向量的相关性,为当前PU建立候选预测MV(MVP)列表.编码器从中选出最优的预测MV,并对MV进行差分编码:解码端会构造相同的列表,仅需要运动向 ...

  7. HEVC代码学习19:MV、MVD、MVP概念解析

    在代码阅读中,可以看到MV.MVD.MVP三个概念,在开始学习的时候就很糊涂,一直买具体来看下,也找不到具体在哪里有讲解,现在来关注学习一下. 先来逗比一下,名词解析: MVP--most valua ...

  8. HEVC代码学习6:filterHor和filterVer函数

    帧间预测分为运动估计ME和运动补偿MV,其中用到了MV的亚像素搜索,需要使用filterHor和filterVer进行插值. 这里使用的是HM16,在之前版本中分为filterHorLuma.filt ...

  9. HEVC代码学习27:calcRdCost函数

    之前在率失真代价TComRdCost类中提到,计算率失真代价的函数为:calcRdCost,下面就来学习一下. calcRdCost工作流程如下: 1.根据输入的失真类型eDFunc来设置λ. 2.根 ...

最新文章

  1. 1.MySQL基本体系
  2. 具有实际意义的5种云遣返
  3. (51)SSDT HOOK 实现进程保护
  4. 背景虚化_一分钟学会背景虚化,掌握3个关键就能拍出好照片
  5. gitkraen_超详细!Github团队协作教程(Gitkraken版)
  6. php用script判断闰年,php判断/计算闰年的方法小结【三种方法】
  7. 类的继承python 简明_[简明python教程]学习笔记2014-05-04
  8. 教你做前端表单文本框必填
  9. 如何在六个月或更短的时间内成为DevOps工程师(一)
  10. 关于pytorch里面的图像变换
  11. [转载]url带中文参数显示乱码的问题
  12. 利用apache的ab命令做服务器压力测试
  13. SVN自助更新:运维利器Puppet实例讲解
  14. 玩转Heartbeat,快速实现高可用性集群
  15. JavaScript学习笔记(四)
  16. Python数据结构之字节,字节数组
  17. ImageJ工具使用简介
  18. COPRA RF 2005 SR1冷弯成型,轧辊设计 USB加密锁
  19. android自动对焦第一次对焦,Android自定义相机实现自动对焦和手动对焦
  20. Linux配置Samba实现局域网共享文件夹

热门文章

  1. 5.代码C语言程序设计
  2. 2022年中国春节档电影观影人次、票房收入及票价走势分析[图]
  3. 小米抢注mi.io域名 “雷布斯”要做小米小程序?
  4. maven使用,Nexus配置阿里云代理仓库,三方仓库,本地仓库
  5. office2016安装记录
  6. 预测2019浙大计算机考研分数,2019年浙江大学考研复试分数线已出现
  7. 恐怖绝伦,SOPA和PIPA捅了网站窝
  8. 亚马逊要求化妆品提交HRIPT / RIPT测试报告和COA证书详情解析
  9. Numeric Keypad
  10. windows安装CUDA11.1,搭建PaddlePaddle和PaddleHub