用python可视化.depth文件

用python可视化.depth文件,并且跟随鼠标的箭头显示深度值

点击查看代码
import numpy as np
import cv2
import matplotlib
matplotlib.use('TkAgg')  # 必须在导入 pyplot 之前设置
import matplotlib.pyplot as plt
from matplotlib.backends.backend_agg import FigureCanvasAgg

# ===================== 配置参数 =====================
depth_file_path = r"E:\PycharmWorkSpace\slambook2-master\slambook2-master\3rdparty\remode_test_data\test_data\depthmaps\scene_000.depth"  # 你的.depth文件路径
width, height = 640, 480  # REMODE数据集尺寸
cmap = 'plasma'  # 深度可视化最佳色板(plasma/inferno)
title = "REMODE Depth Map (Interactive)"

# ===================== 读取并处理深度数据 =====================
# 1. 读取.depth文件(厘米转米)
with open(depth_file_path, 'r', encoding='utf-8') as f:
    depth_data = np.array(list(map(float, f.read().split()))).reshape(height, width)
    depth_m = depth_data / 100.0  # 转换为米
    # 过滤无效深度值(可选:小于0.1米或大于10米设为NaN)
    depth_m[(depth_m < 0.1) | (depth_m > 10.0)] = np.nan


# ===================== 定义交互式回调函数 =====================
def on_hover(event):
    """鼠标悬停事件:实时显示像素坐标和深度值"""
    # 获取当前坐标轴
    ax = event.inaxes
    if ax is None:
        return  # 鼠标移出图像区域,不显示

    # 获取鼠标位置的像素坐标(x:列/宽度,y:行/高度)
    x, y = int(event.xdata + 0.5), int(event.ydata + 0.5)

    # 检查坐标是否在图像范围内
    if 0 <= x < width and 0 <= y < height:
        depth_val = depth_m[y, x]
        # 显示格式:(像素坐标) 深度值(保留3位小数)
        if np.isnan(depth_val):
            text_str = f"Pixel: ({x}, {y}) | Depth: Invalid"
        else:
            text_str = f"Pixel: ({x}, {y}) | Depth: {depth_val:.3f} m"
        # 更新文本框内容
        info_text.set_text(text_str)
    else:
        info_text.set_text("Pixel: (Out of Range) | Depth: --")

    # 强制刷新画布
    fig.canvas.draw_idle()


# ===================== 创建交互式绘图窗口 =====================
# 创建画布和坐标轴
fig, ax = plt.subplots(figsize=(10, 8))
#fig.canvas.set_window_title(title)

# 绘制深度图
im = ax.imshow(depth_m, cmap=cmap)
ax.set_title(title, fontsize=12, pad=10)
ax.axis('off')  # 隐藏坐标轴

# 添加颜色条(深度标尺)
cbar = fig.colorbar(im, ax=ax, label='Depth (m)', shrink=0.8)
cbar.ax.tick_params(labelsize=10)

# 添加文本框:显示鼠标位置和深度值(固定在图像下方)
info_text = ax.text(
    0.5, -0.1,  # 位置(相对坐标轴,0-1)
    "Pixel: (--, --) | Depth: --",
    ha='center', va='top', transform=ax.transAxes,
    fontsize=10, bbox=dict(boxstyle='round', facecolor='white', alpha=0.8)
)

# 绑定鼠标移动事件
fig.canvas.mpl_connect('motion_notify_event', on_hover)

# ===================== 显示窗口 =====================
plt.tight_layout()
plt.show()

image

posted @ 2026-03-02 11:48  阳光天气  阅读(0)  评论(0)    收藏  举报