何处改变参考码以从HEVC编码的视频中提取运动矢量

时间:2018-03-06 07:16:01

标签: c++ hevc

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

讨论here向我讲述了我需要与之交互以获取MV的TComDataCU类方法,并讨论如何迭代CTU。但我仍然不能理解以下内容:

1)这些MV方法返回的信息和格式是什么?由于我的知识有限,我假设会有类似于与MV相关的7个值:帧编号,标识该帧中宏块的索引,宏块的大小,宏块的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看起来像是不对称的方向组合?

任何帮助都会很棒!我想我会从看到一些示例代码中获益最多。对我需要注意的变量的解释也会非常有用。

1 个答案:

答案 0 :(得分:2)

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

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

然后您可以使用CTU的地址选择确切的CTU。 pCtu(TComDataCU class)->getCtuRsAddr()

之后,

pCtu->getCUMvField()

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

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

返回特定的4x4块MV的Horizo​​ntal元素。

您可以在m_pcCuEncoder->compressCtu( pCtu )之后保存这些数据,因为compressCtu确定了CTU的所有数据,例如CU分区和运动估计等。

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