【问题标题】:Visualize Optical Flow with color model使用颜色模型可视化光流
【发布时间】:2015-05-08 00:46:12
【问题描述】:

我已经实现了一个密集的光流算法,我想用下面的颜色模型来可视化它

(颜色表示某一点的流动方向,强度表示位移向量的长度)

我已经实现了可视化的肮脏版本

def visualizeFlow(u, v):
    colorModel = cv2.imread('../colormodel.png')
    colorModelCenter = (colorModel.shape[0]/2, colorModel.shape[1]/2)
    res = np.zeros((u.shape[0], u.shape[1], 3), dtype=np.uint8)
    mag = np.max(np.sqrt(u**2 + v**2)) 
    if mag == 0:
        return res, colorModel
    for i in xrange(res.shape[0]):
        for j in xrange(res.shape[1]):
            res[i, j] = colorModel[
                        colorModelCenter[0] + (v[i, j]/mag*colorModelCenter[0]),
                        colorModelCenter[1] + (u[i, j]/mag*colorModelCenter[1])
                    ]
    return res, colorModel

一般情况下的图片效果很好,但速度很慢

所以我的问题是任何人都可以帮助我更快地进行可视化吗?如果有人知道一种更好的方式来可视化密集流动,那可能会很酷

【问题讨论】:

  • “真的很慢”是什么意思?
  • @Micka 对大小为 2637 x 1300 的流进行可视化需要几分钟。这对我来说非常重要,因为我想在扭曲迭代中使用它来跟踪优化过程中的流量如何变化。至少金字塔可视化级别可能需要很长时间。
  • 如果将高度和宽度相加,那就是 for 循环运行的次数。你能看出它慢的原因吗?
  • @GPPK 刚才我从循环中删除 /mag*colorModelCenter (并用单乘法替换它),似乎函数变得更快。我想另一个问题是在 python 代码中多次调用矩阵项。
  • 如果你经常调用这个,你可能不应该在每次调用中读取模型,而是加载一次并通过。但我不在 python 中,所以不确定。

标签: python opencv computer-vision opticalflow


【解决方案1】:

如果你使用 opencv 提供的函数,你的代码会运行得更快。 光流可视化的工作原理如下:

  • 将 u 和 v 运动分量矩阵转换为极坐标。应用cartToPolar 函数(x 数组 = u 数组,y 数组 = v 数组)将获得运动矢量的角度和幅度矩阵。

最终的颜色可视化可以通过逆 HSV 到 RGB 转换来找到,其中角度矩阵对应于色调 (H) 通道,而幅度对应于饱和度 (S),值 (V) 设置为最大值。 (在您的示例中,交换了值和饱和度通道)。

  • 使用mergemixChannels将幅度、角度和填充为1的矩阵合并到CV_32FC3通道矩阵。

  • 应用带有CV_HSV2BGR 标志的cvtColor。注意角度矩阵以度为单位,必须重新调整幅度以适合 i [0,1],这可以通过使用例如将其除以幅度的最大值来完成。 MinMaxLoc

【讨论】:

    【解决方案2】:

    来自OpenCV's tutorial的代码:

    import cv2
    import numpy as np
    
    # Use Hue, Saturation, Value colour model 
    hsv = np.zeros(im1.shape, dtype=np.uint8)
    hsv[..., 1] = 255
    
    mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
    hsv[..., 0] = ang * 180 / np.pi / 2
    hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)
    bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
    cv2.imshow("colored flow", bgr)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    【讨论】:

    • 流量的维度是多少?我已将计算出的 u 和 v 作为参数传递(dim 480 x 640)。结果它自 hsv[...,0].shape =480 以来抛出了一个错误,并且分配不正确。
    【解决方案3】:

    您可能想查看很棒的flow_vis 包。引用their page:

    1. pip install flow_vis

    2. 然后在你的代码中:

    import flow_vis
    flow_color = flow_vis.flow_to_color(flow_uv, convert_to_bgr=False)
    

    【讨论】:

      猜你喜欢
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 2017-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多