【问题标题】:Where to alter reference code to extract motion vectors from HEVC encoded video在哪里更改参考代码以从 HEVC 编码的视频中提取运动矢量
【发布时间】:2018-03-06 07:16:01
【问题描述】:

所以这个问题已经被问过几次了,但我认为我的 C++ 技能太差,无法真正欣赏答案。我需要的是一种从 HEVC 编码的视频开始并以包含所有运动矢量的 CSV 结束的方法。到目前为止,我已经编译并运行了参考解码器,一切似乎都运行良好。我不确定这是否重要,但我对运动矢量感兴趣,因为它可以方便地分析视频中的运动。我最初的计划是对每一帧中的 MV 进行平均,以获得一个表示该帧中平均移动量的值。

here 的讨论告诉我我需要与之交互以获取 MV 的 TComDataCU 类方法,并讨论了如何迭代 CTU。但我还是不太明白以下内容:

1) 这些 MV 方法返回什么信息,以什么格式返回?以我有限的知识,我假设会有类似 7 个值与 MV 相关联:帧号、标识该帧中宏块的索引、宏块的大小、宏块的 x 坐标(可能是左上角?),宏块的y坐标,向量的x坐标,向量的y坐标。

2) 我需要在代码的哪个位置放置保存数据的新语句?我认为在 TComDataCU.cpp 中必须有一些地方我可以在其中放置行,将我想要的数据打印到文件中,但是当实际确定这些值以及它们是什么时,我感到困惑。变量声明如下所示:

  // create motion vector fields

  m_pCtuAboveLeft      = NULL;
  m_pCtuAboveRight     = NULL;
  m_pCtuAbove          = NULL;
  m_pCtuLeft           = NULL;

但我无法理解这些名字。 AboveLeft、AboveRight、Above 和 Left 看起来像是方向的不对称组合?

任何帮助都会很棒!我想我会从看到一些示例代码中受益匪浅。解释一下我需要注意的变量也会很有帮助。

【问题讨论】:

    标签: c++ hevc


    【解决方案1】:

    TEncSlice.cpp,您可以访问循环中的每个 CTU

    for( UInt ctuTsAddr = startCtuTsAddr; ctuTsAddr < boundingCtuTsAddr; ++ctuTsAddr )
    

    然后您可以通过使用 CTU 的地址来选择确切的 CTU。 pCtu(TComDataCU class)-&gt;getCtuRsAddr().

    之后,

    pCtu->getCUMvField()
    

    将返回 CTU 的运动矢量场。您可以在该对象中提取 CTU 的 MV。 例如,

    TComMvField->getMv(g_auiRasterToZscan[y * 16 + x])->getHor() 
    

    返回特定的 4x4 块 MV 的水平元素。

    m_pcCuEncoder-&gt;compressCtu( pCtu )之后可以保存这些数据,因为compressCtu决定了CTU的所有数据,比如CU分区和运动估计等。

    希望这些信息对您和其他人有所帮助!

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 2013-11-28
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      相关资源
      最近更新 更多