c# halcon视觉PCB基板瑕疵检测程序源码 应用技术:c#,halcon,opencv ...
最近在折腾工业质检项目,手头刚撸完一套PCB基板瑕疵检测系统。这套玩意儿用C#搭框架,Halcon做核心视觉处理,外挂OpenCV打辅助,实测效果比纯传统方案提升30%检测效率。这套系统踩过的坑比深圳电子厂的PCB板还多,但最终实现99.2%的检出率。工业相机的SDK能把人整疯,我们封装了个万用控制层。功能统计:多种缺陷检测、IO控制、相机控制、灯光控制、TCP/IP、视觉定位、激光校正。功能统计
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瑕疵可视化,那又是另一个深坑...
更多推荐
所有评论(0)