使用颜色模型可视化光流
Visualize Optical Flow with color model
我已经实现了密集光流算法,我想用以下颜色模型将其可视化
(颜色表示某一点的流动方向,强度表示位移矢量的长度)
我实现了可视化的脏版本
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
它在一般情况下生成不错的图片,但它真的很慢
所以我的问题是任何人都可以帮助我更快地进行可视化吗?如果有人知道一种更好的可视化密集流的方法,那可能会很酷
如果您使用 opencv 提供的函数,您的代码将 运行 更快。
光流可视化的工作原理如下:
- 将u和v运动分量矩阵转换为极坐标。应用
cartToPolar
函数(x 数组 = u 数组,y 数组 = v 数组)将为您提供运动矢量的角度和幅度矩阵。
最终的颜色可视化可以通过逆向 HSV 到 RGB 变换找到,其中角度矩阵对应于色调 (H) 通道,幅度对应于饱和度 (S),值 (V) 设置为最大值。 (在您的示例中,交换了值和饱和度通道)。
使用 merge
或 mixChannels
.
[= 将幅度、角度和用 1 填充的矩阵合并到 CV_32FC3
通道矩阵30=]
应用 cvtColor
标志 CV_HSV2BGR
。注意角度矩阵以度为单位,必须重新调整幅度以适应 i [0,1],这可以通过使用例如将其除以幅度的最大值来完成。 MinMaxLoc
来自 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()
您可能想查看很棒的 flow_vis
包。引用自 their page:
pip install flow_vis
然后在你的代码中:
import flow_vis
flow_color = flow_vis.flow_to_color(flow_uv, convert_to_bgr=False)
我已经实现了密集光流算法,我想用以下颜色模型将其可视化
(颜色表示某一点的流动方向,强度表示位移矢量的长度)
我实现了可视化的脏版本
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
它在一般情况下生成不错的图片,但它真的很慢
所以我的问题是任何人都可以帮助我更快地进行可视化吗?如果有人知道一种更好的可视化密集流的方法,那可能会很酷
如果您使用 opencv 提供的函数,您的代码将 运行 更快。 光流可视化的工作原理如下:
- 将u和v运动分量矩阵转换为极坐标。应用
cartToPolar
函数(x 数组 = u 数组,y 数组 = v 数组)将为您提供运动矢量的角度和幅度矩阵。
最终的颜色可视化可以通过逆向 HSV 到 RGB 变换找到,其中角度矩阵对应于色调 (H) 通道,幅度对应于饱和度 (S),值 (V) 设置为最大值。 (在您的示例中,交换了值和饱和度通道)。
使用
[= 将幅度、角度和用 1 填充的矩阵合并到merge
或mixChannels
.CV_32FC3
通道矩阵30=]应用
cvtColor
标志CV_HSV2BGR
。注意角度矩阵以度为单位,必须重新调整幅度以适应 i [0,1],这可以通过使用例如将其除以幅度的最大值来完成。MinMaxLoc
来自 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()
您可能想查看很棒的 flow_vis
包。引用自 their page:
pip install flow_vis
然后在你的代码中:
import flow_vis
flow_color = flow_vis.flow_to_color(flow_uv, convert_to_bgr=False)