在工业自动化领域摸爬滚打多年,我见过太多团队在视觉检测系统开发上重复踩坑。最近整理了一个基于C#和Halcon的混合编程框架,这个框架凝结了我们团队在AOI检测、机械手定位等场景下的实战经验。不同于学术性的Demo,这套代码直接脱胎于真实的产线环境——从3C电子到汽车零部件,累计处理过200+种缺陷检测案例。
提示:框架核心设计理念是"插件化+脚本化",既能保证关键算法的执行效率,又能满足产线快速迭代的需求。实测在i5-1135G7处理器上,单次检测周期可控制在8ms以内(1280x1024分辨率)。
框架采用分层设计,自底向上分为:
这种架构的优势在于:
csharp复制// 典型的设备层调用示例
var camera = CameraFactory.Create("Basler_ace2");
camera.SetParameter("ExposureTime", 2000);
var image = camera.Grab();
C#与Halcon混合编程常见的性能瓶颈在于图像数据传递。我们通过以下方案优化:
ReduceDomain()再传递子图像实测对比显示,优化后的方案比传统Bitmap转换方式快3-5倍:
| 处理方式 | 耗时(ms) | 内存占用(MB) |
|---|---|---|
| Bitmap转换 | 15.2 | 45.6 |
| 内存指针直传 | 4.8 | 12.3 |
| ROI子图处理 | 2.1 | 8.7 |
框架内置两种标定模式:
csharp复制// Eye-to-Hand标定典型流程
var calibrator = new TsaiCalibrator();
calibrator.SetChessboard(3, 3, 5.0); // 3x3棋盘格,5mm间距
foreach(var pos in robotPositions)
{
var image = camera.Grab();
var corners = calibrator.FindChessboard(image);
calibrator.AddSample(pos, corners);
}
var error = calibrator.Calibrate(out var transformation);
注意事项:标定板材质建议使用陶瓷基板,温度膨胀系数小于0.5μm/m·K。实测铝合金标定板在温差10℃时,会导致0.3mm的定位漂移。
针对PCB检测的特殊需求,框架预置了以下功能:
csharp复制public class SolderInspection : IVisionPlugin
{
public Result Execute(ImageData image, params object[] args)
{
// 第一步:定位基准点
var fiducials = new HFiducialMark();
using(var model = fiducials.CreateModel(image.ToHObject()))
{
var positions = fiducials.FindMark(image.ToHObject(), model);
}
// 第二步:分割焊点区域
var solderRegions = image.ToHObject()
.Threshold(120, 255)
.Connection()
.SelectShape("area", "and", 500, 99999);
// 第三步:提取特征值
var features = solderRegions.ExtractFeatures(
new[] { "circularity", "gray_mean" });
// 规则判断(示例)
if(features.Any(f => f["circularity"] < 0.7))
return Result.Fail("圆形度不足");
}
}
对于6轴机械手的动态抓取,框架提供:
csharp复制// 动态抓取示例
var tracker = new MovingObjectTracker();
while(!robot.ReachTarget())
{
var image = camera.Grab();
var position = tracker.Update(image);
var robotPos = CoordinateTransformer.CameraToRobot(position);
robot.AdjustTarget(robotPos);
}
在激光切割等高速场景下,我们采用:
csharp复制// 并行处理示例
Parallel.Invoke(
() => { /* 处理区域1 */ },
() => { /* 处理区域2 */ },
() => { /* 处理区域3 */ }
);
图像模糊:
曝光时间(μs) ≤ 1000000/(运动速度(mm/s)×像素精度(mm/pixel)))定位漂移:
算法超时:
HOperatorSet.SetSystem('tsp_mode', 'true')开启Halcon线程安全模式新建插件只需三步:
IVisionPlugin接口plugin.json中注册功能参数csharp复制[PluginMeta(
Name = "划痕检测",
Author = "YourName",
Version = "1.0")]
public class ScratchDetector : IVisionPlugin
{
[Parameter(Min=0, Max=1, Default=0.5)]
public double Sensitivity { get; set; }
public Result Execute(ImageData image, params object[] args)
{
// 实现具体算法
}
}
框架内置的脚本引擎支持:
csharp复制// 调试脚本示例
public class DebugScript : VisionScript
{
public override void Run()
{
Log.Info("开始采集");
var img = GrabImage("Camera1");
// 在IDE中可以查看img的像素值
Debugger.Break();
CallPlugin("焊点检测", img);
}
}
这套框架最宝贵的不是代码本身,而是其中沉淀的工程经验——比如处理过某品牌相机在强电磁干扰下的图像丢帧问题,或是解决过振动环境下标定板轻微晃动导致的定位误差。每个看似简单的API背后,可能都藏着我们调试三天三夜才找到的解决方案。