
1) 【一句话结论】采用微服务架构,前端用React+ECharts构建参数分布仪表盘,后端用Spring Boot处理计算逻辑,结合MySQL(元数据)与InfluxDB(实时数据),通过WebSocket实现前端实时数据推送,确保MTF、畸变等参数的动态可视化。
2) 【原理/概念讲解】
系统核心是“前端展示-后端计算-数据库存储”的实时流式架构。
3) 【对比与适用场景】
| 类别 | 关系型数据库(如MySQL) | 时序数据库(如InfluxDB) |
|---|---|---|
| 定义 | 存储结构化数据,支持复杂查询与事务 | 专为时间序列数据设计,高写入性能 |
| 特性 | 强一致性,事务支持,适合元数据 | 高写入吞吐,聚合查询优化,时间索引 |
| 使用场景 | 设备信息、检测批次、参数标签(非时间序列) | MTF、畸变等实时检测数据(时间序列) |
| 注意点 | 写入性能低,不适合高频实时数据 | 不支持复杂关联查询,需结合关系型数据库(如通过CDC或定时同步元数据) |
4) 【示例】
const socket = new WebSocket('ws://api.sophoton.com/mtf');
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
// 更新MTF曲线图
chart1.setData(data.mtf);
// 更新畸变热力图
heatMap.setData(data.distortion);
};
public class MtfService {
public MtfData calculateMtf(double[] imageData) {
// 1. 离散傅里叶变换(DFT)
double[] freqDomain = discreteFourierTransform(imageData);
// 2. 提取频域响应(如低频到高频的响应值)
double[] mtf = extractFrequencyResponse(freqDomain);
// 3. 计算MTF(如MTF = |H(f)|²,H为传递函数)
double[] mtfResult = computeMtf(mtf);
// 计算畸变(径向畸变参数)
double distortion = computeRadialDistortion(imageData);
return new MtfData(mtfResult, distortion);
}
@MessageMapping("/mtf")
public void sendMtfData(MtfData data) {
webSocketTemplate.send("/topic/mtf", data);
}
}
5) 【面试口播版答案】
面试官您好,我来设计一个光学检测数据可视化平台。核心思路是构建微服务架构,前端用React和ECharts,后端用Spring Boot,数据库分两类:MySQL存储设备元数据(如设备ID、检测批次),InfluxDB存储实时MTF、畸变数据。展示方式上,MTF用曲线图展示空间频率响应,畸变用热力图展示各区域畸变程度。实时更新通过WebSocket实现,后端计算新数据后立即推送到前端,避免轮询。具体来说,前端通过WebSocket连接后端,实时接收MTF和畸变数据,动态更新图表。后端处理检测设备上传的原始图像数据,计算MTF时,先对图像进行离散傅里叶变换(DFT),提取频域响应,再计算MTF值;计算畸变时,采用径向畸变模型(如Brown-Conrady模型),通过图像配准算法估计径向畸变参数,然后将结果存入InfluxDB,并通过WebSocket广播给前端。这样就能实时展示镜头参数的分布情况。
6) 【追问清单】
7) 【常见坑/雷区】