c# halcon视觉PCB基板瑕疵检测程序源码 应用技术:c#,halcon,opencv 功能统计:多种缺陷检测、IO控制、相机控制、灯光控制、TCP/IP、视觉定位、激光校正 流程简介 1.单片检测自动储存瑕疵工单 2.B面检测完毕自动合并产生双面工单 3.人工复判 4.瑕疵整合输出 5.批量加载储存所有序列号 6.瑕疵分类统计 7.瑕疵标注卡参数设定

最近在折腾工业质检项目,手头刚撸完一套PCB基板瑕疵检测系统。这套玩意儿用C#搭框架,Halcon做核心视觉处理,外挂OpenCV打辅助,实测效果比纯传统方案提升30%检测效率。今儿挑几个硬核实现点跟大伙唠唠。

相机控制这潭水有多深

工业相机的SDK能把人整疯,我们封装了个万用控制层。核心代码用工厂模式动态加载不同厂商的DLL:

public ICamera CreateCamera(CameraType type)
{
    switch (type)
    {
        case CameraType.Basler:
            return new BaslerCamera();
        case CameraType.Daheng:
            return new DahengCameraWrapper();
        case CameraType.HIKVision:
            return new HikvisionCameraProxy();
        default:
            throw new ArgumentOutOfRangeException();
    }
}

实战中发现Basler相机的触发模式有坑,必须配合IO卡做硬件同步。后来加了这段超时熔断机制才稳定:

bool TryCapture(int timeoutMs, out HImage image)
{
    var resetEvent = new AutoResetEvent(false);
    Camera.OnFrameReceived += (img) => {
        image = img.Clone();
        resetEvent.Set();
    };
    return resetEvent.WaitOne(timeoutMs);
}

瑕疵检测的十八般武艺

焊盘缺损检测用Halcon的形态学处理玩出花:

* 关键处理流程
read_image (Image, 'pcb')
threshold (Image, Regions, 128, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 500, 5000)
dilation_circle (SelectedRegions, RegionDilation, 3.5)

铜箔划痕检测则上了频域分析。OpenCV的FFT变换比Halcon快一倍,这里混搭使用:

// OpenCV做快速傅里叶变换
using var srcMat = new Mat("scratch.png");
Cv2.Dft(srcMat, complexMat);
Cv2.Split(complexMat, planes);
Cv2.Magnitude(planes[0], planes[1], magnitude);

双面工单合并的骚操作

c# halcon视觉PCB基板瑕疵检测程序源码 应用技术:c#,halcon,opencv 功能统计:多种缺陷检测、IO控制、相机控制、灯光控制、TCP/IP、视觉定位、激光校正 流程简介 1.单片检测自动储存瑕疵工单 2.B面检测完毕自动合并产生双面工单 3.人工复判 4.瑕疵整合输出 5.批量加载储存所有序列号 6.瑕疵分类统计 7.瑕疵标注卡参数设定

B面检测完成后要自动合并数据,这里用了个内存映射文件的黑科技:

using var mmf = MemoryMappedFile.CreateOrOpen("PCB_Data", 1024);
var accessor = mmf.CreateViewAccessor();
accessor.Write(0, ref sideA_Data);
accessor.Write(512, ref sideB_Data); 

合并时发现坐标系统不统一,激光校正模块派上用场。通过标定板生成的空间变换矩阵,硬是把两面数据对齐到0.05mm精度。

人工复判的反人性设计

质检员老张头吐槽界面卡顿,排查发现是WPF的绑定树太深。改造成虚拟化列表后,3000+瑕疵点的渲染速度从8秒降到0.3秒:

<ListView VirtualizingPanel.IsVirtualizing="True" 
          VirtualizingPanel.VirtualizationMode="Recycling">
    <ListView.ItemTemplate>
        <!-- 简化后的数据模板 -->
    </ListView.ItemTemplate>
</ListView>

参数设定的动态加载

瑕疵阈值能动态调整才是王道。自己撸了个JSON配置热加载系统,改参数不用重启:

var watcher = new FileSystemWatcher("Configs");
watcher.Changed += (s, e) => {
    var newConfig = JsonConvert.DeserializeObject<Params>(File.ReadAllText(e.FullPath));
    _currentParams.UpdateFrom(newConfig);
};

这套系统踩过的坑比深圳电子厂的PCB板还多,但最终实现99.2%的检出率。现在产线小哥再也不用拿放大镜找瑕疵了,算是没白掉这些头发。下次有机会再聊聊怎么用WPF做3D瑕疵可视化,那又是另一个深坑...

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐