You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用直方图测量零定向有噪料箱的内部尺寸

料箱内部尺寸测量方案(基于点云直方图)

前置准备

先加载点云数据:

import numpy as np
points = np.load('your_point_cloud.npy')  # 替换为你的npy文件路径

一、X/Y轴内部尺寸测量(峰间平坦区距离)

X/Y轴的尺寸定义为直方图两侧峰之间的平坦区域距离,核心是识别料箱壁对应的峰,以及中间内部空间的平坦区:

  1. 提取单轴数据:

    x_data = points[:, 0]  # X轴坐标
    y_data = points[:, 1]  # Y轴坐标
    
  2. 绘制并预处理直方图:
    用滑动窗口平滑直方图计数,过滤噪声干扰:

    import matplotlib.pyplot as plt
    from scipy.signal import find_peaks
    
    # 以X轴为例,Y轴逻辑完全一致
    counts_x, bins_x, _ = plt.hist(x_data, bins='auto', alpha=0.5)
    window_size = 5  # 可根据噪声大小调整
    smoothed_counts_x = np.convolve(counts_x, np.ones(window_size)/window_size, mode='same')
    
  3. 识别峰与平坦区:

    • 用find_peaks筛选料箱壁对应的高幅值峰(过滤噪声小峰)
    • 设定平坦区阈值:取峰最大计数的10%-20%,低于该值的区域判定为内部空间的平坦区
    # 筛选高幅值峰
    peaks_x, _ = find_peaks(smoothed_counts_x, height=np.max(smoothed_counts_x)*0.5)
    # 平坦区计数阈值
    flat_threshold_x = np.max(smoothed_counts_x) * 0.15
    
  4. 计算尺寸:
    找到最左侧峰右侧的第一个平坦区左边界,以及最右侧峰左侧的最后一个平坦区右边界,两者的差值即为内部尺寸:

    # 找左侧平坦区起始位置
    left_flat_idx = None
    for i in range(peaks_x[0], len(smoothed_counts_x)):
        if smoothed_counts_x[i] < flat_threshold_x:
            left_flat_idx = i
            break
    # 找右侧平坦区结束位置
    right_flat_idx = None
    for i in range(peaks_x[-1], 0, -1):
        if smoothed_counts_x[i] < flat_threshold_x:
            right_flat_idx = i
            break
    # 取bin的中心值计算尺寸
    x_min = (bins_x[left_flat_idx] + bins_x[left_flat_idx+1]) / 2
    x_max = (bins_x[right_flat_idx] + bins_x[right_flat_idx+1]) / 2
    x_size = x_max - x_min
    print(f"X轴内部尺寸: {x_size:.2f}")
    

二、Z轴内部尺寸测量(最低平坦点到最大Z值的距离)

Z轴尺寸定义为最低平坦点与点云最大Z值的差值,步骤如下:

  1. 提取Z轴数据:

    z_data = points[:, 2]
    
  2. 预处理直方图并识别最低平坦区:

    counts_z, bins_z, _ = plt.hist(z_data, bins='auto', alpha=0.5)
    smoothed_counts_z = np.convolve(counts_z, np.ones(window_size)/window_size, mode='same')
    flat_threshold_z = np.max(smoothed_counts_z) * 0.15
    
    # 从Z值最小的区域开始,找第一个平坦区
    lowest_flat_idx = None
    for i in range(len(smoothed_counts_z)):
        if smoothed_counts_z[i] < flat_threshold_z:
            lowest_flat_idx = i
            break
    
  3. 计算尺寸:

    # 取最低平坦区的平均Z值
    lowest_flat_z = (bins_z[lowest_flat_idx] + bins_z[lowest_flat_idx+1]) / 2
    max_z = np.max(z_data)
    z_size = max_z - lowest_flat_z
    print(f"Z轴内部尺寸: {z_size:.2f}")
    

关键注意事项

  • 噪声处理:若点云噪声过大,可先做离群点过滤(比如用统计滤波移除距离均值过远的点),或增大滑动窗口尺寸
  • bins参数:bins='auto'自动适配分辨率,若效果不佳可手动设置固定bins数(如bins=100)
  • 峰的筛选:find_peaks的height参数可灵活调整,确保只识别料箱壁的有效峰

内容的提问来源于stack exchange,提问作者bhomaidan90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 23:47:35