HEVC预测块(PU)模式划分显示

最近在做关于3D-HEVC的实验,很想直观显示出最终的预测模式(PU)划分结果。最近看到了一个帖子,动了HEVC解码器部分,能直观显示出PU划分结果,但是,只能显示一帧(即解码的第一帧 I-Slice), 后面的全乱了。对于做帧间的是不够的,必须把每帧的划分结果直观地显示出来。仔细看了他的教程,我在此基础进行了改进,目前能够正常显示出HEVC、MV-HEVC的PU划分结果。在此,感谢网站(程光曦微)的作者。

1. PU模式划分显示效果图

HEVC第一帧划分显示

HEVC帧间PU划分显示

2. HEVC decoder 代码修改

该程序是基于HM 11.0/3D-HTM的,废话不多说了,给出修改代码步骤。

2.1 PU划分数据结构体定义及宏定义

为了不改变源代码程序逻辑,我们所有修改的代码都放在自己定义的预处理命令宏定义中。
在TypeDef.h中,定义自己的条件编译预处理命令。
#define statistics_mode 1//用于统计输出块信息
在TypeDef.h中,定义保存PU划分坐标点结构体。
#if statistics_mode
	struct PtPair
	{
	  unsigned int _pt1x;
	  unsigned int _pt1y;
	  unsigned int _pt2x;
	  unsigned int _pt2y;
	  unsigned char mode;
	};
#endif

2.2 PU划分及mode向量定义

为了保存各帧CU及mode最终划分结果,在TAppDecTop.h文件中定义如下代码:
class TAppDecTop : public TAppDecCfg
{
private:
#if statistics_mode
	std::vector
    
    
     
      m_plistPt;//用于保存CU划分及mode结果
	std::vector
     
     
      
       flag;//用于保存每帧的mode数量
#endif

     
     
    
    

2.3 修改各函数头,将m_plistPt传递进去

在TAppDecTop.cpp文件中, 按照下面的方式替换源代码:
//原来的代码
bNewPicture = m_cTDecTop.decode(nalu, m_iSkipFrame, m_iPOCLastDisplay);
//修改成如下代码
#if statistics_mode
bNewPicture = m_cTDecTop.decode(nalu, m_iSkipFrame, m_iPOCLastDisplay,m_plistPt);
#else
bNewPicture = m_cTDecTop.decode(nalu, m_iSkipFrame, m_iPOCLastDisplay);
#endif
编译程序,肯定会出错,因为没有修改相应的函数头。在TDecTop.cpp文件中,按照下面的方式修改decode函数头:
#if statistics_mode
Bool TDecTop::decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay,std::vector
     
     
      
      & list)
#else
Bool TDecTop::decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay)
#endif

     
     
在TDecTop.h中,也需要对应修改decode函数声明,按照以下方式修改该函数声明:
#if statistics_mode
  Bool TDecTop::decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay,std::vector
     
     
      
      & list);
#else
  Bool  decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay);
#endif

     
     
接下来,将m_plistPt传递到xDecodeSlice函数中,将decode函数中的xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay)修改成xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay,list);即将m_plistPt传递到xDecodeSlice函数中。同样地,需要修改相应的函数头,在TDecTop.cpp文件中,修改对应的函数头,按照下面方式修改:
#if statistics_mode
Bool TDecTop::xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay,std::vector
      
      
       
       & list )
#else
Bool TDecTop::xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay )
#endif

      
      
在TDecTop.h中,按照下面方式替换DecodeSlice函数声明:
#if statistics_mode
Bool TDecTop::xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay,std::vector
       
       
        
        & list );
#else
  Bool      xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay);
#endif

       
       
接下来,在xDecodeSlice函数中,将m_cGopDecoder.decompressSlice(nalu.m_Bitstream, pcPic);替换成如下代码:
//  Decode a picture
#if statistics_mode
  m_cGopDecoder.decompressSlice(nalu.m_Bitstream, pcPic,list);
#else
  m_cGopDecoder.decompressSlice(nalu.m_Bitstream, pcPic);
#endif
不要忘了,修改对应的函数头和声明,按照下面方式修改:
在TDecTop.cpp文件中,
#if statistics_mode
Void TDecGop::decompressSlice(TComInputBitstream* pcBitstream, TComPic*& rpcPic, std::vector
       
       
        
        & list)
#else
Void TDecGop::decompressSlice(TComInputBitstream* pcBitstream, TComPic*& rpcPic)
#endif

       
       
在TDecTop.h文件中,
#if statistics_mode
  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
以下是一个简单的MATLAB代码示例,用于实现HEVC的帧内预测: ```matlab function [predBlock] = intra_predict(image, blockSize, row, col, mode) % image: 输入图像 % blockSize: 大小 % row, col: 当前的起始行和列 % mode: 帧内预测模式 % 获取参考像素 switch(mode) case 0 % 模式0:DC预测 refBlock = image(row:blockSize + row - 1, col:blockSize + col - 1); p = mean2(refBlock); predBlock = ones(blockSize, blockSize) * p; case 1 % 模式1:水平预测 refBlock = image(row:blockSize + row - 1, col - 1); predBlock = repmat(refBlock, [1, blockSize]); case 2 % 模式2:垂直预测 refBlock = image(row - 1, col:blockSize + col - 1); predBlock = repmat(refBlock, [blockSize, 1]); case 3 % 模式3:左上角预测 refBlock = image(row - 1, col - 1); predBlock = ones(blockSize, blockSize) * refBlock; case 4 % 模式4:右上角预测 refBlock = image(row - 1, col + blockSize); predBlock = ones(blockSize, blockSize) * refBlock; case 5 % 模式5:左下角预测 refBlock = image(row + blockSize, col - 1); predBlock = ones(blockSize, blockSize) * refBlock; case 6 % 模式6:垂直右下预测 refBlock1 = image(row - 1, col + blockSize); refBlock2 = image(row - 2, col + blockSize); refBlock3 = image(row - 3, col + blockSize); refBlock4 = image(row - 4, col + blockSize); refBlock5 = image(row - 5, col + blockSize); refBlock6 = image(row - 6, col + blockSize); refBlock7 = image(row - 7, col + blockSize); refBlock = (refBlock1 + 2 * refBlock2 + 3 * refBlock3 + 4 * refBlock4 + 5 * refBlock5 + 6 * refBlock6 + 7 * refBlock7 + 8) / 16; predBlock = ones(blockSize, blockSize) * refBlock; case 7 % 模式7:水平右下预测 refBlock1 = image(row + blockSize, col - 1); refBlock2 = image(row + blockSize, col - 2); refBlock3 = image(row + blockSize, col - 3); refBlock4 = image(row + blockSize, col - 4); refBlock5 = image(row + blockSize, col - 5); refBlock6 = image(row + blockSize, col - 6); refBlock7 = image(row + blockSize, col - 7); refBlock = (refBlock1 + 2 * refBlock2 + 3 * refBlock3 + 4 * refBlock4 + 5 * refBlock5 + 6 * refBlock6 + 7 * refBlock7 + 8) / 16; predBlock = ones(blockSize, blockSize) * refBlock; end end ``` 请注意,此代码仅实现了HEVC的帧内预测的一些基本模式,可能需要根据您的特定需求进行更改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值