remove depth and fix normal -> vnormal

This commit is contained in:
bluepulsar
2025-12-28 18:52:55 +08:00
parent 6ec9eaa334
commit 4192683271
12 changed files with 54 additions and 60 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 MiB

After

Width:  |  Height:  |  Size: 2.0 MiB

+2 -10
View File
@@ -58,14 +58,12 @@ def main():
# 其他: # 其他:
# - FPS: 当前帧率 # - FPS: 当前帧率
# - TIMESTAMP: 时间戳字符串 # - TIMESTAMP: 时间戳字符串
# - DEPTH: 深度图(归一化 0-1) fps, fn, fx, fy, flow = sensor.read_info(
fps, fn, fx, fy, flow, depth = sensor.read_info(
sensor.info.FPS, sensor.info.FPS,
sensor.info.FNORMAL, sensor.info.FNORMAL,
sensor.info.FSHEARX, sensor.info.FSHEARX,
sensor.info.FSHEARY, sensor.info.FSHEARY,
sensor.info.VRAW, sensor.info.VRAW
sensor.info.DEPTH
) )
# 打印力的数值 # 打印力的数值
@@ -90,12 +88,6 @@ def main():
) )
cv2.imshow("形变场 Deformation", arrows) cv2.imshow("形变场 Deformation", arrows)
# 绘制深度图(热力图)
depth_img = cv2.applyColorMap(
(depth * 255.0).astype('uint8'),
cv2.COLORMAP_HOT
)
cv2.imshow("深度图 Depth", depth_img)
# ===================================================================== # =====================================================================
# 4. 键盘控制 # 4. 键盘控制
+1 -6
View File
@@ -19,17 +19,12 @@ def main():
# 向量场: VRAW, VNORMAL, VSHEAR: 原始,法向,切向 # 向量场: VRAW, VNORMAL, VSHEAR: 原始,法向,切向
# 帧率,时间戳: FPS, TIMESTAMP # 帧率,时间戳: FPS, TIMESTAMP
# 变形量总和: FNORMAL , FSHEARX, FSHEARY : 法向,切向(X),切向(Y) # 变形量总和: FNORMAL , FSHEARX, FSHEARY : 法向,切向(X),切向(Y)
# 深度图: DEPTH fps, fn, fx, fy, flow = sensor1.read_info(sensor1.info.FPS, sensor1.info.FNORMAL, sensor1.info.FSHEARX, sensor1.info.FSHEARY, sensor1.info.VRAW)
fps, fn, fx, fy, flow, depth = sensor1.read_info(sensor1.info.FPS, sensor1.info.FNORMAL, sensor1.info.FSHEARX, sensor1.info.FSHEARY, sensor1.info.VRAW, sensor1.info.DEPTH)
# 显示向量场 # 显示向量场
arrows = orisys.util.draw_arrows(sensor1.img, flow, threshold=5, grid_spacing=40, arrow_scale=1.0) arrows = orisys.util.draw_arrows(sensor1.img, flow, threshold=5, grid_spacing=40, arrow_scale=1.0)
cv2.imshow("Deformation", arrows) cv2.imshow("Deformation", arrows)
depth_img = cv2.applyColorMap((depth*1* 255.0).astype('uint8'), cv2.COLORMAP_HOT)
cv2.imshow('depth', depth_img)
key = cv2.waitKey(1) key = cv2.waitKey(1)
if key & 0xFF == ord("q"): if key & 0xFF == ord("q"):
print("\n 停止程序") print("\n 停止程序")
+1 -6
View File
@@ -25,17 +25,12 @@ def main():
# 向量场: VRAW, VNORMAL, VSHEAR: 原始,法向,切向 # 向量场: VRAW, VNORMAL, VSHEAR: 原始,法向,切向
# 帧率,时间戳: FPS, TIMESTAMP # 帧率,时间戳: FPS, TIMESTAMP
# 变形量总和: FNORMAL , FSHEARX, FSHEARY : 法向,切向(X),切向(Y) # 变形量总和: FNORMAL , FSHEARX, FSHEARY : 法向,切向(X),切向(Y)
# 深度图: DEPTH fps, fn, fx, fy, flow = sensor1.read_info(sensor1.info.FPS, sensor1.info.FNORMAL, sensor1.info.FSHEARX, sensor1.info.FSHEARY, sensor1.info.VRAW)
fps, fn, fx, fy, flow, depth = sensor1.read_info(sensor1.info.FPS, sensor1.info.FNORMAL, sensor1.info.FSHEARX, sensor1.info.FSHEARY, sensor1.info.VRAW, sensor1.info.DEPTH)
print(fps,fn,fx,fy) print(fps,fn,fx,fy)
# 显示向量场 # 显示向量场
arrows = orisys.util.draw_arrows(sensor1.img, flow, threshold=5, grid_spacing=40, arrow_scale=1.0) arrows = orisys.util.draw_arrows(sensor1.img, flow, threshold=5, grid_spacing=40, arrow_scale=1.0)
cv2.imshow("Deformation", arrows) cv2.imshow("Deformation", arrows)
depth_img = cv2.applyColorMap((depth*1* 255.0).astype('uint8'), cv2.COLORMAP_HOT)
cv2.imshow('depth', depth_img)
key = cv2.waitKey(1) key = cv2.waitKey(1)
if key & 0xFF == ord("q"): if key & 0xFF == ord("q"):
print("\n 停止程序") print("\n 停止程序")
+1 -8
View File
@@ -44,7 +44,7 @@ def main():
'cal_path': './config/cal.npy' 'cal_path': './config/cal.npy'
}, },
{ {
'vid_src': './s1_copy.mp4', 'vid_src': './s1.mp4',
'isstitch': True, 'isstitch': True,
'cuda': True, 'cuda': True,
'cal_path': './config/cal.npy' 'cal_path': './config/cal.npy'
@@ -84,13 +84,6 @@ def main():
) )
cv2.imshow(f"传感器 {sid} - 形变", arrows) cv2.imshow(f"传感器 {sid} - 形变", arrows)
# 显示深度图
if data['depth'] is not None:
depth_img = cv2.applyColorMap(
(data['depth'] * 255).astype('uint8'),
cv2.COLORMAP_HOT
)
cv2.imshow(f"传感器 {sid} - 深度", depth_img)
# 检查退出键 # 检查退出键
if cv2.waitKey(1) & 0xFF == ord('q'): if cv2.waitKey(1) & 0xFF == ord('q'):
-7
View File
@@ -80,13 +80,6 @@ def main():
) )
cv2.imshow("异步模式 - 形变", arrows) cv2.imshow("异步模式 - 形变", arrows)
# 显示深度图
if data['depth'] is not None:
depth_img = cv2.applyColorMap(
(data['depth'] * 255).astype('uint8'),
cv2.COLORMAP_HOT
)
cv2.imshow("异步模式 - 深度", depth_img)
# 键盘控制 # 键盘控制
key = cv2.waitKey(1) & 0xFF key = cv2.waitKey(1) & 0xFF
+1 -1
View File
@@ -98,7 +98,7 @@ def main_manual():
""" """
configs = [ configs = [
{'vid_src': './s1.mp4', 'isstitch': True, 'cuda': True, 'cal_path': './config/cal.npy'}, {'vid_src': './s1.mp4', 'isstitch': True, 'cuda': True, 'cal_path': './config/cal.npy'},
{'vid_src': './s1_copy.mp4', 'isstitch': True, 'cuda': True, 'cal_path': './config/cal.npy'}, {'vid_src': './s1.mp4', 'isstitch': True, 'cuda': True, 'cal_path': './config/cal.npy'},
] ]
# 创建 MultiSensor 实例 # 创建 MultiSensor 实例
+3 -12
View File
@@ -25,11 +25,10 @@ def main():
# 步骤 2.2: 计算形变场 # 步骤 2.2: 计算形变场
sensor.compute_deformation() sensor.compute_deformation()
fps, flow,vnormal, depth = sensor.read_info( fps, flow,vnormal = sensor.read_info(
sensor.info.FPS, sensor.info.FPS,
sensor.info.VRAW, sensor.info.VRAW,
sensor.info.VNORMAL, sensor.info.VNORMAL
sensor.info.DEPTH
) )
# depth = get_depth_improved(vnormal, fps) # depth = get_depth_improved(vnormal, fps)
@@ -37,8 +36,6 @@ def main():
# print(f"FPS: {fps:5.1f}, 深度: {np.min(depth):8.2f}, {np.mean(depth):8.2f}, {np.max(depth):8.2f}") # print(f"FPS: {fps:5.1f}, 深度: {np.min(depth):8.2f}, {np.mean(depth):8.2f}, {np.max(depth):8.2f}")
arrows = orisys.util.draw_arrows( arrows = orisys.util.draw_arrows(
sensor.img.copy(), # 使用 copy() 避免修改原图 sensor.img.copy(), # 使用 copy() 避免修改原图
vnormal, vnormal,
@@ -60,17 +57,11 @@ def main():
# 计算扩张焦点 # 计算扩张焦点
# foe_result = orisys.util.compute_foe(vnormal,min_magnitude=1,expansion_threshold=0.01,downsample_factor=1) # foe_result = orisys.util.compute_foe(vnormal,min_magnitude=1,expansion_threshold=0.01,downsample_factor=1)
foe_result = sensor.get_foe(multiple_foe=False, min_magnitude=1, expansion_threshold=0.01, downsample_factor=1) foe_result = sensor.get_foe(multiple_foe=False, min_magnitude=1, expansion_threshold=0.01, downsample_factor=1,denoise_sigma=10)
# 在图像上绘制焦点和区域 # 在图像上绘制焦点和区域
image_with_foe = orisys.util.draw_foe(sensor.img.copy(), foe_result) image_with_foe = orisys.util.draw_foe(sensor.img.copy(), foe_result)
cv2.imshow("Focus of Expansion", image_with_foe) cv2.imshow("Focus of Expansion", image_with_foe)
# 计算多个扩张焦点
# foe_result = orisys.util.compute_multiple_foe(vnormal, min_contour_area=3000,min_magnitude=1,expansion_threshold=0.001,downsample_factor=10)
# # 在图像上绘制多个焦点和区域
# image_with_foe = orisys.util.draw_multiple_foe(sensor.img.copy(), foe_result)
# cv2.imshow("Multiple FOE", image_with_foe)
# ===================================================================== # =====================================================================
# 4. 键盘控制 # 4. 键盘控制
+1 -1
View File
@@ -75,7 +75,7 @@ def _sensor_worker(sensor_id, config, data_queue, stop_event, use_async=False):
'sensor_id': sensor_id, 'sensor_id': sensor_id,
'img': sensor.img.copy() if sensor.img is not None else None, 'img': sensor.img.copy() if sensor.img is not None else None,
'flow': sensor.flow.copy() if sensor.flow is not None else None, 'flow': sensor.flow.copy() if sensor.flow is not None else None,
'normal': sensor.normal.copy() if sensor.normal is not None else None, 'normal': sensor.vnormal.copy() if sensor.vnormal is not None else None,
'shear': sensor.shear.copy() if sensor.shear is not None else None, 'shear': sensor.shear.copy() if sensor.shear is not None else None,
'depth': sensor.depth.copy() if sensor.depth is not None else None, 'depth': sensor.depth.copy() if sensor.depth is not None else None,
'fps': sensor.fps, 'fps': sensor.fps,
+31 -2
View File
@@ -1,7 +1,8 @@
import numpy as np import numpy as np
import cv2 import cv2
from scipy.ndimage import gaussian_filter
def compute_foe(flow_field, min_magnitude=1.0, expansion_threshold=1, downsample_factor=10, return_all_contours=False, kernel_size=(5,5), denoise_sigma=1.5): def compute_foe(flow_field, min_magnitude=1.0, expansion_threshold=1, downsample_factor=10, return_all_contours=False, kernel_size=(5,5), denoise_sigma=10):
""" """
计算光流场的扩张焦点(Focus of Expansion)。 计算光流场的扩张焦点(Focus of Expansion)。
@@ -87,7 +88,7 @@ def compute_foe(flow_field, min_magnitude=1.0, expansion_threshold=1, downsample
return result return result
def compute_multiple_foe(flow_field, min_magnitude=1.0, expansion_threshold=0.001, def compute_multiple_foe(flow_field, min_magnitude=1.0, expansion_threshold=0.001,
downsample_factor=10, min_contour_area=3000, denoise_sigma=1.5, kernel_size=(5,5)): downsample_factor=10, min_contour_area=3000, denoise_sigma=10, kernel_size=(5,5)):
""" """
计算光流场的多个扩张焦点(Foci of Expansion)。 计算光流场的多个扩张焦点(Foci of Expansion)。
@@ -142,3 +143,31 @@ def compute_multiple_foe(flow_field, min_magnitude=1.0, expansion_threshold=0.00
result['expansion_regions'].append(contour) result['expansion_regions'].append(contour)
return result return result
def smooth_magnitude(mag, method='moving_average', window_size=5, downsample_factor=4):
"""
平滑幅度图以减少梯度计算时的伪影。
Args:
mag: 幅度图,形状为 (H, W) 的 numpy 数组
method: 平滑方法,'moving_average' 或 'windowed_interpolation'
window_size: 移动平均的窗口大小(默认5)
downsample_factor: 窗口插值的下采样因子(默认4)
Returns:
np.ndarray: 平滑后的幅度图
"""
if method == 'moving_average':
# 使用移动平均滤波器(box filter)
kernel = np.ones((window_size, window_size), dtype=np.float32) / (window_size * window_size)
mag_smooth = cv2.filter2D(mag, -1, kernel)
elif method == 'windowed_interpolation':
# 使用窗口插值:下采样然后插值回原尺寸
h, w = mag.shape
mag_downsampled = mag[::downsample_factor, ::downsample_factor]
mag_smooth = cv2.resize(mag_downsampled, (w, h), interpolation=cv2.INTER_CUBIC)
else:
# 默认使用高斯滤波
mag_smooth = gaussian_filter(mag, sigma=1.5)
return mag_smooth
+8 -2
View File
@@ -42,13 +42,19 @@ def main():
cv2.imshow("形变场 Deformation", arrows) cv2.imshow("形变场 Deformation", arrows)
mag = np.sqrt(vnormal[:, :, 0]**2 + vnormal[:, :, 1]**2) mag = np.sqrt(vnormal[:, :, 0]**2 + vnormal[:, :, 1]**2)
mag = gaussian_filter(mag, sigma=12)
mag_div = np.gradient(mag, axis=1) + np.gradient(mag, axis=0)
mag_div = np.where(mag_div>0, mag_div, 0)
mag_img = cv2.applyColorMap( mag_img = cv2.applyColorMap(
(mag/20 * 255.0).astype('uint8'), (mag_div/0.2 * 255.0).astype('uint8'),
cv2.COLORMAP_JET cv2.COLORMAP_JET
) )
cv2.imshow("magnitude map", mag_img) cv2.imshow("magnitude map", mag_img)
print(np.median(mag), np.min(mag), np.max(mag)) # print(np.median(mag), np.min(mag), np.max(mag))
print(np.median(mag_div), np.min(mag_div), np.max(mag_div))
# ===================================================================== # =====================================================================
# 4. 键盘控制 # 4. 键盘控制
+4 -4
View File
@@ -204,11 +204,11 @@ def estimate_depth(foe=None, flow=None, init_depth=None, min_radial_flow=0.01, T
# 处理FOE附近区域:使用平滑后的值 # 处理FOE附近区域:使用平滑后的值
if np.any(mask_foe_region): if np.any(mask_foe_region):
depth_smoothed = gaussian_filter(depth, sigma=2.0) depth_smoothed = gaussian_filter(depth, sigma=15)
depth[mask_foe_region] = depth_smoothed[mask_foe_region] depth[mask_foe_region] = depth_smoothed[mask_foe_region]
# 应用高斯滤波平滑整个深度图,减少噪声和伪影 # 应用高斯滤波平滑整个深度图,减少噪声和伪影
depth = gaussian_filter(depth, sigma=1.5) depth = gaussian_filter(depth, sigma=15)
# 缩放深度(如果提供了初始深度,只使用掩码内的值) # 缩放深度(如果提供了初始深度,只使用掩码内的值)
if init_depth is not None: if init_depth is not None:
@@ -248,7 +248,7 @@ def estimate_depth(foe=None, flow=None, init_depth=None, min_radial_flow=0.01, T
depth = np.clip(depth, p1, p99) depth = np.clip(depth, p1, p99)
# 最终平滑:对FOE附近区域再次应用平滑,确保伪影被消除 # 最终平滑:对FOE附近区域再次应用平滑,确保伪影被消除
depth_final_smooth = gaussian_filter(depth, sigma=1.0) depth_final_smooth = gaussian_filter(depth, sigma=15)
# 重新计算FOE附近掩码 # 重新计算FOE附近掩码
rx = xx - fx rx = xx - fx
@@ -321,7 +321,7 @@ def main():
# 计算扩张焦点 # 计算扩张焦点
# foe_result = orisys.util.compute_foe(vnormal,min_magnitude=1,expansion_threshold=0.01,downsample_factor=1) # foe_result = orisys.util.compute_foe(vnormal,min_magnitude=1,expansion_threshold=0.01,downsample_factor=1)
foe_result = sensor.get_foe(multiple_foe=False, min_magnitude=1, expansion_threshold=0.01, downsample_factor=1) foe_result = sensor.get_foe(multiple_foe=False, min_magnitude=1, expansion_threshold=0.01, downsample_factor=1,denoise_sigma=15)
# 在图像上绘制焦点和区域 # 在图像上绘制焦点和区域
image_with_foe = orisys.util.draw_foe(sensor.img.copy(), foe_result) image_with_foe = orisys.util.draw_foe(sensor.img.copy(), foe_result)
cv2.imshow("Focus of Expansion", image_with_foe) cv2.imshow("Focus of Expansion", image_with_foe)