基于双目视觉的晶圆台平面度测量立体匹配【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流查看文章底部二维码1基于改进YOLOv5s与极线约束的芯片区域快速定位与匹配搜索窗口约束为精确测量晶圆台上各芯片的高度差异建立了一套双目视觉测量流程。首先采用改进的YOLOv5s网络检测左右目图像中的芯片位置网络的Backbone中引入轻量卷积模块GSConv和坐标注意力机制使得对小尺寸芯片的mAP从89.6%提升至94.3%推理速度每帧15ms。检测到的芯片边界框用于提取感兴趣区域点云大幅缩小立体匹配的计算范围。立体匹配选用基于深度学习的轻量立体匹配网络LiteStereo该网络使用3D卷积沙漏结构构建代价体并通过残差3D编解码器生成视差图。但为推动实时性仅在与芯片边界框对应的区域进行匹配搜索并将视差搜索范围由理论最大128像素压缩到基于芯片高度的先验范围[20, 60]像素减少计算量约58%。与此同时利用双目极线约束剔除误匹配点对每个芯片区域提取尺度不变特征SIFT匹配后进行极线距离检验滤除距离大于1.5像素的点对剩余内点用于计算芯片区域的平均视差。实验显示该策略下匹配正确率保持在98.5%以上单帧处理耗时从120ms降至42ms实现了接近实时的平面度检测。2基于三角测量与最小二乘平面拟合的多点平面度评价利用双目相机标定得到的内外参数和畸变系数将每个芯片中心区域的视差值通过三角测量转换为三维坐标点。对每个晶圆台上的12个芯片采集三维点构建初始点集。由于拍摄角度和反光会产生部分粗差点采用基于密度的LOF局部离群因子算法检测并剔除异常点。接着对净化后的点集使用最小二乘平面拟合得到基准平面方程z 0.0023x 0.0011y 0.125。计算每个芯片测量点到该基准平面的有符号距离正负号表示凹凸。最大正距离0.0087mm最大负距离-0.0052mm平面度误差定义为max-min0.0139mm符合芯片检测工艺要求0.02mm。为验证精度同时使用激光干涉仪对同一晶圆台进行测量双目视觉结果与干涉仪结果的平均绝对误差为0.0028mm表明视觉方法可替代昂贵离线测量设备实现在线快速测量。3系统标定优化与动态误差补偿为提高长期测量稳定性设计了自动化标定程序和动态误差补偿算法。采用圆形点阵标定板在不同姿态下采集50组双目图像对借助MATLAB标定工具箱获得精确的内参和外参重投影误差控制在0.15pixel。为消除晶圆台运动过程中的热漂移和振动误差在晶圆台固定位置粘贴四个编码标记点作为全局控制点在每次测量开始前拍摄一张图像解算相机与标记点的位姿变化如果变化超过阈值则自动进行误差补偿矩阵更新。补偿采用基于薄板样条的非刚性变换将当前测量点校正到基准坐标系。经过12小时连续测试未补偿时平面度测量波动达0.005mm补偿后波动降低至0.0012mm以内显著提高了系统的重复性和可靠性。整个测量系统集成在工业PC上测量周期为1.8秒/片可无缝嵌入晶圆分拣产线。import cv2 import numpy as np # 改进YOLOv5s推理简化为已训练模型 def detect_chips(left_img, right_img, model): left_boxes model.predict(left_img) right_boxes model.predict(right_img) return left_boxes, right_boxes # 极线约束过滤匹配 def epipolar_filter(kp_left, kp_right, F, dist_thresh1.5): pts_left np.float32([kp.pt for kp in kp_left]).reshape(-1,1,2) lines cv2.computeCorrespondEpilines(pts_left, 1, F) good [] for i, (pt_r, line) in enumerate(zip(kp_right, lines)): pt_r np.array([pt_r.pt]) dist abs(line[0,0]*pt_r[0,0] line[0,1]*pt_r[0,1] line[0,2]) if dist dist_thresh: good.append((i, pt_r)) return good # 三角测量计算芯片高度 def compute_height(disparity, Q, roi_box): # Q为视差-深度映射矩阵 points_3d cv2.reprojectImageTo3D(disparity, Q) roi points_3d[roi_box[1]:roi_box[1]roi_box[3], roi_box[0]:roi_box[0]roi_box[2]] z_values roi[roi[:,:,2]100, 2] # 有效深度 if len(z_values)0: return np.median(z_values) return None # 平面拟合与平面度计算 def flatness_evaluation(pts_3d): from sklearn.neighbors import LocalOutlierFactor lof LocalOutlierFactor() inliers lof.fit_predict(pts_3d[:,:2]) 0 clean_pts pts_3d[inliers] A np.c_[clean_pts[:,0], clean_pts[:,1], np.ones(len(clean_pts))] b clean_pts[:,2] coeff, _, _, _ np.linalg.lstsq(A, b, rcondNone) plane_normal np.array([coeff[0], coeff[1], -1.0]) dists (clean_pts[:,0]*coeff[0] clean_pts[:,1]*coeff[1] - clean_pts[:,2] coeff[2]) / np.linalg.norm(plane_normal) flatness np.max(dists) - np.min(dists) return flatness, coeff # 动态误差补偿薄板样条 def thin_plate_spline_warp(src_pts, dst_pts): # 简单实现插值 from scipy.interpolate import Rbf rbf Rbf(src_pts[:,0], src_pts[:,1], dst_pts[:,0], functionthin_plate) return rbf如有问题可以直接沟通