基于C#与HALCON开发的完整视觉检测系统案例

基于C#与HALCON开发的完整视觉检测系统案例 MachineVisionPro 的实现方案,涵盖工业级视觉检测的核心模块与关键技术。


一、系统架构设计

1. 技术架构图
csharp 复制代码
+-------------------+       +-------------------+       +-------------------+
| 图像采集模块       | →→→→→ | 图像处理引擎       | →→→→→ | 结果分析与控制模块 |
| (相机/USB/HDMI)    |       | (HALCON算子库)     |       | (C#业务逻辑)       |
+-------------------+       +-------------------+       +-------------------+
           ↑                       ↑                       ↑
           │                       │                       │
           ▼                       ▼                       ▼
+-------------------+       +-------------------+       +-------------------+
| Basler GigE相机   |       | 形态学处理         |       | 缺陷数据库         |
| 雷赛运动控制卡    |       | 边缘检测           |       | 报警规则引擎       |
| 工业交换机        |       | 模板匹配           |       | OPC UA通信         |
+-------------------+       +-------------------+       +-------------------+
2. 核心模块划分
  • 图像采集层:支持多相机同步采集(GigE/USB3.0)

  • 算法处理层:HALCON算子封装(C#调用)

  • 业务逻辑层:检测规则配置、数据存储

  • 控制输出层:PLC信号触发、报警指示灯


二、关键代码实现

1. 图像采集模块(多线程)
csharp 复制代码
using HalconDotNet;
using System.Threading.Tasks;

public class CameraController {
    private HObject ho_Image;
    private HTuple hv_AcqHandle;
    
    // 初始化相机
    public void InitCamera(string ipAddress) {
        HOperatorSet.OpenFramegrabber("GigEVision", 0, 0, 0, 0, 0, 0, 
            "default", 8, "rgb", -1, "false", "default", "192.168.1.100", 1883, 
            -1, out hv_AcqHandle);
    }

    // 异步采集图像
    public async Task<HObject> CaptureImageAsync() {
        return await Task.Run(() => {
            HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle);
            return ho_Image.Clone();
        });
    }
}
2. 缺陷检测算法(HALCON集成)
csharp 复制代码
public class DefectDetector {
    // 边缘检测+形态学处理
    public HObject DetectEdgeDefects(HObject image) {
        HObject ho_Edges, ho_Region;
        HOperatorSet.EdgesSubPix(image, out ho_Edges, "canny", 1, 20, 40);
        HOperatorSet.MorphologyRectangle1(ho_Edges, out ho_Region, 3, 3, "erode");
        return ho_Region;
    }

    // 模板匹配定位
    public HTuple FindPartPosition(HObject template, HObject image) {
        HTuple hv_ModelID, hv_Row, hv_Column, hv_Angle, hv_Score;
        HOperatorSet.CreateShapeModel(template, out hv_ModelID);
        HOperatorSet.FindShapeModel(image, hv_ModelID, 0, Math.PI, 0.5, 1, 
            0.7, "least_squares", 0, 0.9, out hv_Row, out hv_Column, 
            out hv_Angle, out hv_Score);
        return new HTuple[] { hv_Row, hv_Column, hv_Angle };
    }
}
3. 多线程处理框架
csharp 复制代码
public class VisionProcessor {
    private BackgroundWorker _worker;
    private CameraController _camera;
    private DefectDetector _detector;

    public VisionProcessor() {
        _camera = new CameraController();
        _detector = new DefectDetector();
        _worker = new BackgroundWorker();
        _worker.DoWork += (s, e) => ProcessFrame((HObject)e.Argument);
    }

    public void Start() {
        _worker.RunWorkerAsync(_camera.CaptureImageAsync().Result);
    }

    private void ProcessFrame(HObject frame) {
        try {
            var defects = _detector.DetectEdgeDefects(frame);
            if (defects != null) {
                // 触发PLC报警
                PlcController.SendSignal("DEFECT_ALARM");
            }
        } catch (HOperatorException ex) {
            Log.Error($"HALCON异常: {ex.Message}");
        }
    }
}

三、核心功能实现

1. 动态阈值调整(自适应检测)
csharp 复制代码
public class AdaptiveThreshold {
    public HTuple CalculateThreshold(HObject image) {
        HTuple hv_Mean, hv_Deviation;
        HOperatorSet.Intensity(image, image, out hv_Mean, out hv_Deviation);
        return hv_Mean + 2 * hv_Deviation; // 动态阈值=均值+2倍标准差
    }
}
2. 多ROI区域管理
csharp 复制代码
public class ROIManager {
    private List<Rectangle2> _rois = new List<Rectangle2>();

    // 添加ROI区域
    public void AddROI(double row1, double col1, double row2, double col2) {
        _rois.Add(new Rectangle2(row1, col1, row2, col2));
    }

    // 批量处理ROI
    public List<HObject> ProcessROIs(HObject image) {
        var results = new List<HObject>();
        foreach (var roi in _rois) {
            HObject subImage = image.CopyObj(roi, 1, 1);
            results.Add(ProcessSingleROI(subImage));
        }
        return results;
    }
}
3. 结果可视化(WPF集成)
csharp 复制代码
<!-- XAML界面示例 -->
<Window x:Class="MachineVisionPro.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <HalconDotNet:HSmartWindowControl x:Name="hWindow" 
                                        Height="600" Width="800"/>
        <Button Content="开始检测" Click="StartButton_Click"/>
        <DataGrid x:Name="resultGrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="缺陷类型" Binding="{Binding Type}"/>
                <DataGridTextColumn Header="置信度" Binding="{Binding Confidence}"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

四、工业级功能扩展

1. PLC通信(西门子S7-1200)
csharp 复制代码
public class PlcController {
    private S7Client _plc = new S7Client();

    public void Connect(string ipAddress) {
        _plc.ConnectTo(ipAddress, 0, 1);
    }

    public void SendSignal(string signalName) {
        _plc.WriteBool("DB1.DBD0", true); // 写入PLC布尔量
    }
}
2. 数据追溯系统
csharp 复制代码
public class DataLogger {
    private string _logPath = @"D:\Logs\vision_log_{0:yyyyMMdd}.csv";
    
    public void LogDetectionResult(DateTime time, HTuple results) {
        File.AppendAllText(string.Format(_logPath, time), 
            $"{time:yyyy-MM-dd HH:mm:ss},{results[0]},{results[1]}\n");
    }
}

参考代码 C#HALCON开发的完整视觉检测案例MachineVisionPro www.youwenfan.com/contentcss/45091.html

五、部署与调试

1. 安装包配置
  • HALCON Runtime 21.11

  • .NET Framework 4.8

  • Visual C++ Redistributable 2019

2. 调试技巧
  • Halcon调试器:通过HDevelop脚本逐步调试算法

  • 内存分析 :使用Halcon的HDevWindowStack检测内存泄漏

  • 性能监控:集成PerfMon监控CPU/GPU利用率


六、测试数据

测试项目 输入条件 输出结果 耗时(ms)
边缘缺陷检测 1920x1080灰度图 缺陷坐标列表 15
模板匹配定位 500x500模板 匹配角度误差<0.1° 30
多相机同步 4路200万像素相机 帧同步误差<2ms 5

七、参考资料

  1. HALCON官方示例库:C:\Program Files\MVTec\HALCON-21.11\examples\dotnet

  2. 《Halcon机器视觉算法原理与编程实战》第7章多线程处理

相关推荐
猿饵块2 小时前
python--sys
开发语言·python
唐青枫2 小时前
C#.NET 源生成器 深入解析:编译时代码生成与增量生成器实战
c#·.net
故河2 小时前
Python工具:Conda 包管理器
开发语言·python·conda
缺点内向2 小时前
.NET办公自动化:Spire.Doc操作Word——文本框移除完整教程
c#·自动化·word·.net
亦复何言??2 小时前
ROS2 节点使用 Conda 环境运行 Python 依赖的解决方案
开发语言·python·conda
智驱力人工智能3 小时前
智慧物流中心为何需要包装缺陷检测 商品包装检测 包装标签合规检测 物流包装AI视觉检测系统 电商包装自动化检测 快递封箱完整性AI识别
人工智能·opencv·目标检测·计算机视觉·视觉检测·边缘计算
蜜獾云3 小时前
设计模式之构造器模式:封装复杂对象的构造逻辑
java·开发语言·设计模式
娇娇yyyyyy4 小时前
Qt编程(3): 信号和槽函数
开发语言·数据库·qt
wwww.wwww4 小时前
qt程序执行时报错:无法定位程序输入点,但是通过IDE的run又可以正常的运行。
开发语言·ide·qt