为什么用机器视觉质检

人工质检有三个死穴:慢、累、标准飘。一条产线每分钟 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);     // 存图留档
}

触发延迟要控制在毫秒级,否则产品走过了才拍就废了。