基于体素速度分量获取光流真值的实现问题咨询
从模拟速度分量生成光流真值方案
可以实现,你的模拟速度分量本身就是严格的光流真值,现有代码的问题修复后即可得到正确可视化结果
当前代码的核心问题有3个:
- 坐标系不匹配:OpenCV的像素坐标系y轴向下为正,物理模拟的速度y分量通常向上为正,直接传入会导致角度计算完全错误,需要先翻转vy符号
- 归一化逻辑异常:若模拟速度存在离群极值,全局归一化会导致有效速度的亮度被压缩,可通过分位数截断解决
- 维度顺序需要确认:请先验证你的3D数组维度为
(x, y, z, 分量),若维度顺序为(z, y, x, 分量)需要调整vx、vy的取值索引
修正后的可运行代码
import numpy as np import cv2 data = np.fromfile('Velocity/ns_1000_v.dat', dtype=np.float32) # 若你的数据维度顺序为(z,y,x,3),请修改reshape参数的顺序 data = np.reshape(data,(128, 128, 128, 3)) slice_num = 5 vx = data[:,:,slice_num,0] vy = data[:,:,slice_num,1] # 修正y方向速度符号,匹配图像像素坐标系 vy = -vy hsv = np.zeros((128,128,3), dtype=np.uint8) hsv[..., 1] = 255 mag, ang = cv2.cartToPolar(vx, vy) hsv[..., 0] = ang * 180 / np.pi / 2 # 修正归一化逻辑,截断99分位数以上的离群值避免亮度压缩 mag_max = np.percentile(mag, 99) mag = np.clip(mag, 0, mag_max) hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U) bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) # 输出可视化结果 cv2.imwrite('gt_optical_flow.png', bgr)
对比时的对齐要求
和你基于密度计算的无监督光流做定量对比时,需要满足两个对齐条件:
- 空间对齐:提取真值的切片位置、分辨率和无监督方案输出的光流完全一致
- 数值对齐:计算EPE(端点误差)等指标时,两者的速度要使用相同的缩放系数,不能各自独立归一化
内容的提问来源于stack exchange,提问作者gadirohd
相关产品推荐
相关产品推荐

