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



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

这里的讨论告诉我需要与之交互才能获得 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;

但我对这些名字没有多大意义。左上、右上、上、左似乎是方向的不对称混合?

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

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 的水平元素。

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

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

最新更新