光流
1. 数据格式
光流数据不好标注,至少还没有看到有关光流标注的方法。一般的,光流表示相邻两帧图像中,同一个像素点的移动,前向光流是t -> t+1 的,所以对光流进行可视化时,物体的轮廓和t时刻是一致的。后向光流一般定义的是:t - > t-1。
开源的光流数据有很多格式,不过一般都会提供数据解析的例子,按例子进行读取解析就行。光流的数据为:HxWx2,H,W分别表示图像的高度和宽度,2表示在x,y方向上的移动像素数。同时,这里的移动是以当前点为基点移动的。
这里对sintel数据集中一张图片进行可视化。
第一张图是0.5 x img1 + 0.5 x img2。
第二张图是光流可视化效果。
2. flow warp
拿到一个开源的光流数据集如何检查数据的正确性呢?如何将光流和图片一起联合起来进行直观的可视化?
flow warp就是根据光流对图片进行采样。这里我们采用cv2.remap进行实现。
code:
步骤:
- 根据h, w 生成基准点矩阵,注意grid 是一个 HxWx2的矩阵,最后一个维度2,表示[x, y]方向的位移。以下是对grid部分值的打印。
- grid + flow,得到warp需要的光流。
- 最后用opencv的remap进行采样,得到warp后的图像。
- 这里warp的图像是img1,还是img2呢? 应该用img2来warp,因为new_flow是在img2中像素点的位置。所以整个warp是从img2根据前向光流warp到img1的过程。
可视化:
第一张图是img1
第二张图是img2 warp得到的 img1
为什么warp得到的img1有重影呢?
因为:new_flow = grid + flow,grid是基点矩阵,flow为 [0, 0]时,remap时,就会采集原来的点。flow不为0时,会根据 new_flow 进行采样。