C#联合halcon开发框架源码。 拖拽式编程,无halcon基础也能上手,匹配,测量,条码识别,ocr,定位引导,对位等,支持plc通讯,集成主流相机sdk,系统集成.

最近在工业视觉项目里折腾Halcon的时候,发现很多兄弟都被C++劝退,其实用C#搭个轮子也能玩得很溜。今天聊的这个框架直接把Halcon封装成拖拉拽的积木块,连halcon语法都不用背就能搞定位引导、OCR识别这些硬核功能,还能和PLC对线。

先看这个可视化编程界面(丢个伪代码):

<Canvas>
    <VisionBlock x:Name="GrabImage" Type="CameraAcquire" Position="100,50"/>
    <VisionBlock x:Name="FindBarcode" Type="BarcodeReader" Position="100,150" 
                 Input="{Binding GrabImage.Output}"/>
    <Connection From="GrabImage.Output" To="FindBarcode.Input"/>
</Canvas>

背后的代码生成器直接给你吐C#代码,省得手写HDevEngine调脚本。比如条码识别模块,框架把Halcon的findbarcodeshapemodel封装得跟嚼口香糖一样简单:

var result = BarcodeEngine.Read(image, new BarcodeConfig {
    Mode = DecodeMode.Aggressive,
    RetryCount = 3  //PLC老哥们最爱的重试机制
});
if(result.Score > 0.8) SendToPLC(result.Data); 

尤其喜欢它的异常处理彩蛋——相机掉线自动重连时会在日志里埋个梗:"相机可能去拯救世界了,5秒后重试召唤..."

说到PLC通讯,框架里集成的西门子S7协议处理得贼骚气。不用管字节序那些破事,直接当对象操作:

PlcClient.Write("DB501.Double[20]", 3.14); 
var stationStatus = PlcClient.Read<StationState>("M100.Byte");

底层其实用了个状态机轮询,遇到网络闪断会自动切到缓存模式,比甲方爸爸的脾气稳定多了。

相机SDK集成这块更离谱,某国产相机厂家的API文档写得跟天书似的,框架里直接内置了参数自动纠错:

GigECamera cam = CameraFactory.Create<GigECamera>(ip);
cam.Connect(config => {
    config.PacketSize = 9000;  //玄学优化项
    config.Timeout = 500;      //防止产线大妈拔线
});

实测连某品牌工业相机的时候,框架自动嗅探到的合理PacketSize比官方demo还准,怀疑作者反向工程了驱动...

最实用的还是模板匹配模块,新手最容易栽跟头的地方。框架里把形状匹配的参数调教得跟美颜相机似的:

var matcher = new IntelligentMatcher();
matcher.Train(templateImage, opt => {
    opt.AngleTolerance = 360;  //随便你怎么转
    opt.ScaleRange = 0.5.To(2.0); //放大缩小都能逮
});
var matches = matcher.Search(targetImage);

其实背后偷偷做了金字塔分层搜索,运行时占用的内存比原生的Halcon算子少了30%,毕竟C#的GC不是吃素的。

项目里需要做对位补偿时,直接搬出框架里的坐标转换链:

var worldPoint = VisionCoord.ConvertToWorld(
    imagePoint, 
    CalibrationData.Load("camera123.calib"),
    RobotBaseCoord.GetCurrent()
);

这里埋了个坑——自动处理了手眼标定中的四元数转欧拉角问题,避免菜鸟在姿态解算时翻车。

整套源码里最惊艳的是异常恢复子系统,比如遇到图像传输出错时:

RetryPolicy.Execute(() => {
    GrabFrame();
}, options => {
    options.MaxAttempts = 5;
    options.OnRetry = (ex, attempt) => {
        ReloadCameraDriver();  //重启大法好
        Thread.Sleep(attempt * 1000);
    };
});

这波操作让现场调试的兄弟少掉了一半头发,毕竟产线设备可不会等你单步调试。

搞过Halcon联合开发的应该都懂,内存泄漏和线程同步才是真正的Boss战。框架里用了个ObjectPool管理HImage对象,配合C#的using语法,泄漏?不存在的:

using (var hImage = HImagePool.Get(image)) 
{
    HOperatorSet.FindShapeModel(hImage, ...);
} //自动回收到池里

线程调度更是骚,用SynchronizationContext把Halcon的算子调用打包成任务派发,UI再也不会卡成PPT。

说实话,这个框架最狠的不是技术实现,而是那些藏在工具箱里的实用小工具。比如那个自动生成ROI区域的魔法笔刷,画个不规则多边形还能自动吸附特征点,比Halcon自带的ROI工具顺手不止一个Level。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐