第四章:数据采集实操——亮度计参数设置、自动扫描脚本编写、数据导出与格式转换、异常值剔除
好,咱们进入实操环节。前面讲了那么多理论,说白了都是为了这一刻——真正上手采集数据。我记得第一次带新人做亮度均匀性测试时,小伙子把亮度计架好就开始扫,结果数据出来全是乱的。为什么?参数没设对。
这一章,我带你走一遍完整的流程。从亮度计参数设置,到写自动扫描脚本,再到数据导出和异常值处理。每一步都有坑,我尽量把踩过的坑都告诉你。
4.1 亮度计参数设置——别小看这一步
亮度计不是开机就能用的。你想想看,不同VR头显的亮度范围、色温、刷新率都不一样,参数设不对,数据就是废的。
4.1.1 核心参数有哪些?
| 参数名称 | 推荐设置 | 说明 |
|---|---|---|
| 测量模式 | 点测量 / 阵列扫描 | 均匀性测试建议用阵列扫描 |
| 积分时间 | 100ms ~ 500ms | 根据亮度自动调整,太短噪声大 |
| 视场角(FOV) | 1° ~ 2° | 匹配VR镜头的出瞳直径 |
| 色温匹配 | D65(6500K) | 标准白场测试用 |
| 触发方式 | 软件触发 / 外部触发 | 自动扫描建议用软件触发 |
我个人习惯先把积分时间设到200ms,然后看实时读数。如果亮度值跳动超过±2%,就把积分时间加长。我在项目中遇到过一款Micro-OLED头显,亮度只有80nit,积分时间设到800ms才稳定下来。
4.1.2 白平衡校准
做亮度均匀性之前,先做白平衡校准。这个步骤很多人跳过,但我不建议。为什么?因为亮度计对不同波长的光敏感度不一样,不校准的话,测出来的亮度值会有系统偏差。
具体做法:
- 用标准光源(比如Labsphere的均匀光源)做参考
- 在亮度计软件里输入标准光源的亮度值和色坐标
- 让软件自动计算修正系数
嗯,这一步做完,后面测出来的数据才有说服力。
4.2 自动扫描脚本编写——解放双手
手动测9个点还行,要是测25个点、49个点呢?手都酸了。所以必须写脚本。
我常用的亮度计是Konica Minolta的CS-2000和Topcon的SR-3AR。这两款都支持SCPI指令,通过串口或以太网控制。
4.2.1 脚本框架
下面是一个Python脚本的骨架。我用的是pyvisa库,兼容性比较好。
import pyvisa
import time
import numpy as np
# 连接亮度计
rm = pyvisa.ResourceManager()
meter = rm.open_resource('TCPIP0::192.168.1.100::inst0::INSTR')
# 设置参数
meter.write('MEAS:INT 200') # 积分时间200ms
meter.write('MEAS:FOV 1') # 视场角1°
# 定义扫描点(9点法)
points = [
(0, 0), # 中心
(-30, 0), # 左
(30, 0), # 右
(0, -30), # 下
(0, 30), # 上
(-30, -30), # 左下
(30, -30), # 右下
(-30, 30), # 左上
(30, 30) # 右上
]
results = []
for (x, y) in points:
# 移动平台到指定位置(假设有电动位移台)
stage.move_to(x, y)
time.sleep(0.5) # 等待稳定
# 触发测量
meter.write('MEAS:STAR')
time.sleep(0.3) # 等待测量完成
# 读取数据
data = meter.query('MEAS:DATA?')
results.append((x, y, float(data)))
print(f'点 ({x}, {y}) 亮度: {data} cd/m²')
# 保存结果
np.savetxt('brightness_data.csv', results, delimiter=',',
header='x,y,luminance', comments='')
4.2.2 扫描路径优化
扫描路径怎么走?我见过有人用Z字形,有人用螺旋形。我个人推荐用光栅扫描——从左到右,从上到下。这样数据在空间上是连续的,后期做热力图很方便。
但要注意:VR头显的亮度会随时间漂移。如果扫描时间太长(超过30秒),头显可能已经热起来了,亮度会下降。这时候就需要做时间补偿。
我曾经做过一个测试:连续测60分钟,每5分钟记录一次中心点亮度。结果发现前10分钟亮度下降了8%,之后才稳定。所以,如果你要测大量点,最好先做预热,或者用短积分时间。
4.3 数据导出与格式转换——别让数据烂在仪器里
数据测完了,怎么导出来?不同亮度计的导出方式不一样。
4.3.1 常见导出格式
| 格式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| CSV | 通用 | 兼容性好,Excel能直接打开 | 不支持元数据 |
| XLSX | 报告生成 | 支持多Sheet、图表 | 文件较大 |
| HDF5 | 批量处理 | 支持大数据量、元数据 | 需要专用库 |
| JSON | Web应用 | 结构化好 | 可读性差 |
我个人习惯用CSV。简单、直接、不依赖任何软件。但要注意编码问题——中文路径名有时会乱码,建议全用英文。
4.3.2 格式转换脚本
有时候客户要XLSX格式,有时候要JSON。写个转换脚本一劳永逸。
import pandas as pd
import json
# 读取CSV
df = pd.read_csv('brightness_data.csv')
# 转成XLSX
df.to_excel('brightness_data.xlsx', index=False, sheet_name='亮度数据')
# 转成JSON
data_dict = df.to_dict(orient='records')
with open('brightness_data.json', 'w') as f:
json.dump(data_dict, f, indent=2)
print('转换完成!')
4.4 异常值剔除——数据清洗是必修课
数据采完了,你以为就结束了?不,还有最重要的一步——异常值剔除。
为什么会出异常值?我遇到过的情况:
- 位移台抖动导致测量位置偏移
- 亮度计镜头上有灰尘
- VR头显突然闪了一下(刷新率同步问题)
- 电磁干扰导致通信错误
4.4.1 异常值检测方法
常用的方法有三种:
- 3σ法则:计算所有数据的均值和标准差,超出均值±3σ的视为异常。适合正态分布的数据。
- IQR方法:计算四分位距,超出Q1-1.5×IQR或Q3+1.5×IQR的视为异常。对偏态分布更鲁棒。
- 局部异常因子(LOF):基于密度的异常检测。适合空间数据,比如亮度分布图。
我一般先用3σ法则快速过滤,再用LOF做精细检查。为什么?因为3σ法则简单,但会把边缘区域的正常低亮度误判为异常。VR头显的边缘亮度本来就低,你把它剔除了,均匀性反而变好了——这不科学。
4.4.2 异常值处理流程
我的标准流程是这样的:
- 用3σ法则标记潜在异常值
- 生成异常值报告(包含位置、原始值、判定依据)
- 人工检查每个异常值(看原始测量日志、看测量位置照片)
- 确认是异常后,用插值法替换(线性插值或样条插值)
- 记录替换日志(谁、什么时间、为什么替换、替换成什么)
嗯,最后一步很重要。数据溯源是质量体系的要求。万一客户问起来,你得能说清楚每个数据是怎么来的。
4.5 本章知识体系
下面这张图总结了数据采集的完整流程。你可以把它贴在工位上,每次做测试前看一眼。
这张图把整个流程串起来了。从参数设置到清洁数据输出,每一步都有对应的工具和方法。你照着这个流程走,基本不会出大问题。
好了,数据采集这部分就讲到这里。记住:参数设对、脚本写好、数据导全、异常剔净。这四步做到位,你的亮度均匀性数据就是可靠的。