为什么用机器视觉质检
人工质检有三个死穴:慢、累、标准飘。一条产线每分钟 60 个产品,人眼盯 8 小时就开始漏检。机器视觉能做到:24 小时不停、精度到 0.01mm、标准永远一致。3C 电子、汽车零部件、食品包装、医药——凡是要"看一眼"的工位,都在被视觉替代。
视觉项目的难点不在算法,在光学。光源打不好,再牛的算法也救不回来。
这篇讲从硬件选型到产线集成的完整流程。
硬件选型:相机、镜头、光源
三件套:
- 相机面阵 CCD/CMOS,分辨率按精度算:视场宽度 ÷ 像素数 = 单像素精度。要 0.01mm 精度、视场 100mm,至少 10000 像素,选 1200 万像素相机。
- 镜头定焦远心镜头优先,避免透视畸变。
- 光源同轴光打平面、环形光打凸起、背光打轮廓、条形光打边缘。打光原则:让缺陷和背景的对比度最大。
相机标定
镜头有畸变,像素坐标不能直接当物理尺寸用。标定就是把像素坐标映射到真实世界坐标。常用棋盘格标定板:拍 10~20 张不同角度的棋盘格,用 OpenCV 算出内参和畸变系数。
import cv2, numpy as np
objp = np.zeros((9*6,3), np.float32); objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)
objpoints, imgpoints = [], []
for img in images:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
if ret:
objpoints.append(objp); imgpoints.append(corners)
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# mtx 是内参矩阵,dist 是畸变系数
图像采集与触发
产线是动态的:产品走到工位,相机必须在正确的时刻拍照。做法:光电开关检测产品到位 → 触发相机 → 相机拍照 → 算法处理 → 输出 OK/NG 信号给 PLC。
// 伪代码:采集线程
while (running) {
wait_trigger(); // 等光电开关
img = camera.grab(); // 拍一张
result = inspect(img); // 跑算法
plc.write_ok(result.ok); // 输出给 PLC
log.save(img, result); // 存图留档
}
触发延迟要控制在毫秒级,否则产品走过了才拍就废了。
缺陷检测算法
传统视觉算法分几类:
- Blob 分析找面积异常(脏污、缺料)。
- 边缘检测找尺寸偏差(缺角、变形)。
- 模板匹配找位置偏移、漏装。
- 灰度对比找色差、划痕。
import cv2
img = cv2.imread('part.jpg', 0)
_, th = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY)
n, labels, stats, _ = cv2.connectedComponentsWithStats(th)
for i in range(1, n):
area = stats[i, cv2.CC_STAT_AREA]
if area > 50: # 异常面积 = 缺陷
print(f"defect at area={area}")
深度学习缺陷检测
传统算法对"不规则缺陷"(如表面划痕、色差)力不从心。深度学习(YOLO、U-Net、PatchCore)能自动学缺陷特征。但要注意:
深度学习视觉注意
- 样本缺陷样本少,要用异常检测(PatchCore)。
- 推理速度产线要求 <100ms,选轻量模型。
- 误判NG 漏检 = 客户投诉,OK 误判 = 产能损失。
- 部署边缘 GPU 或 NPU,不要上云。
产线集成
视觉系统不是孤立的,要和 PLC、MES 打通:
// 与 PLC 通信:Modbus TCP
// 1. PLC 发"产品到位"信号
// 2. 视觉处理完,写 OK/NG 到保持寄存器
// 3. NG 产品由 PLC 触发剔除机构
// 4. 结果上传 MES,关联工单批次
视觉项目 70% 的时间花在调试光源和打光,30% 才是算法。先把光打好,再谈模型。
按这套流程走,一条视觉质检工位就能上线了。