使用彩色模型可视化光流

10
我已经实现了一种密集光流算法,并希望使用以下颜色模型进行可视化: 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

因此我的问题是:有没有人能帮我加快可视化速度?如果有更好的方式来可视化密集流,则更好。


"really slow" 是什么意思? - Micka
@Micka,大小为2637 x 1300的流程可视化需要几分钟时间。这对我非常重要,因为我想在扭曲迭代中使用它来跟踪优化过程中流程的变化。而且至少金字塔可视化的级别可能需要太多时间。 - Daiver
如果你将高度和宽度相加,那么你的for循环就会运行这么多次。你能看出它为什么很慢吗? - GPPK
1
如果您经常调用此函数,则最好不要在每次调用中读取模型,而是加载一次并传递。但我不是在Python中,所以不确定。 - Micka
@Micka 给出了很好的建议,但嵌套循环所需的时间比图像读取要多得多。 - Daiver
显示剩余4条评论
3个回答

16

源自OpenCV教程的代码:

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


流量的维度是什么?我已经将我的计算出来的u和v作为参数传递(维度为480 x 640)。结果它抛出了一个错误,因为hsv[...,0].shape =480而赋值不正确。 - creative

6

你可能需要查看令人惊叹的flow_vis软件包。引用自他们的页面:

  1. pip install flow_vis

  2. 然后在你的代码中:

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

3
如果您使用OpenCV提供的函数,您的代码将运行得更快。 光流可视化的工作原理如下:
- 将u和v运动分量矩阵转换为极坐标。应用cartToPolar函数(x数组=u数组,y数组=v数组)将为您获取运动向量的角度和幅度矩阵。
最终的颜色可视化可以通过反向HSV到RGB转换来找到,其中角度矩阵对应于色调(H)通道,而幅度对应于饱和度(S),值(V)设置为最大值。(在您的示例中,值和饱和度通道被交换)。
- 将幅度、角度和一个填充为1的矩阵合并为一个CV_32FC3通道矩阵,使用mergemixChannels。 - 使用标志CV_HSV2BGR应用cvtColor。请注意,角度矩阵以度为单位,并且必须将幅度重新缩放以适合[0,1],这可以通过将其除以幅度的最大值来完成,例如使用MinMaxLoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接