基于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 |
七、参考资料
-
HALCON官方示例库:
C:\Program Files\MVTec\HALCON-21.11\examples\dotnet -
《Halcon机器视觉算法原理与编程实战》第7章多线程处理