使用颜色模型可视化光流

时间:2015-03-06 12:01:20

标签: python opencv computer-vision opticalflow

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

enter image description here

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

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

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

它在一般案例图片中产生很好但是它真的很慢

enter image description here

所以我的问题是,任何人都可以帮助我更快地实现这种可视化吗?如果有人知道更好的方法来显示密集流量,那么它可能很酷

3 个答案:

答案 0 :(得分:7)

来自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()

enter image description here

答案 1 :(得分:1)

如果您使用opencv提供的功能,您的代码将运行得更快。 光流可视化的工作原理如下:

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

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

  • 使用CV_32FC3merge将填充为1的幅度,角度和矩阵合并到mixChannels通道矩阵。

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

答案 2 :(得分:1)

您可能想检查很棒的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)
相关问题