一、Halcon 简介
Halcon 是由德国 MVTec 公司开发的机器视觉算法库,专注于图像处理与分析,广泛应用于工业检测、医疗成像、机器人视觉等领域。其核心优势包括:
-
功能全面:涵盖图像获取、预处理、分割、特征提取、识别、测量等全流程算法。
-
跨平台性:支持 Windows、Linux、macOS 等系统,可与 C/C++、C#、Python 等语言集成。
-
灵活性:提供交互式开发环境 HDevelop,支持算法快速原型设计,再导出为目标语言代码。
-
高性能:针对大规模图像和实时场景优化,支持多核计算、GPU 加速。
二、核心概念与数据类型
-
图像(Image)
存储像素数据的对象,支持单通道(灰度图)、多通道(RGB 等),数据类型包括
byte(0-255)、uint2(16 位无符号)等。- 变量类型:
Hobject(Halcon 通用对象类型,可存储图像、区域等)。
- 变量类型:
-
区域(Region)
由连通像素组成的集合,是 Halcon 中特有的概念,用于表示图像中的感兴趣区域(ROI)。
- 常用操作:阈值分割(
threshold)、连通域提取(connection)、形态学运算(erosion/dilation)等。
- 常用操作:阈值分割(
-
其他关键类型
-
Hlong:Halcon 长整型,用于计数、索引等。 -
HTuple:动态数据容器,可存储数值、字符串等,方便参数传递。
-
三、基本工作流程
-
图像获取:读取本地图像或从相机采集。
-
预处理 :去噪(
mean_image)、增强对比度(emphasize)等。 -
区域分割:通过阈值、边缘检测等提取目标区域。
-
特征分析:计算区域的面积、周长、中心坐标等。
-
结果输出:显示、计数或控制外部设备。
四、示例代码(C++ 接口)
以下示例实现 "PCB 图像中焊点计数",流程为:读取图像 → 阈值分割 → 提取连通域 → 统计数量 → 显示结果。
#include "halconcpp.h"
#include <stdio.h>
using namespace HalconCpp;
int main() {
try {
// 1. 读取图像(假设 "pcb_image.png" 为待处理图像)
HObject img;
ReadImage(&img, "pcb_image.png"); // Halcon 函数名首字母大写(C++ 接口规范)
// 2. 预处理:平滑去噪(减少干扰)
HObject smooth_img;
MeanImage(img, &smooth_img, 3, 3); // 3x3 均值滤波
// 3. 阈值分割:提取灰度值 50~150 的区域(假设焊点在此范围)
HObject region;
Threshold(smooth_img, ®ion, 50, 150);
// 4. 提取连通域:将独立焊点作为单独区域
HObject connected_regions;
Connection(region, &connected_regions);
// 5. 统计区域数量(焊点数量)
Hlong num_solder;
CountObj(connected_regions, &num_solder);
printf("PCB 焊点数量:%ld\n", num_solder);
// 6. 显示结果(需配合 HDevelop 或自定义窗口)
HWindow wnd(100, 100, 800, 600); // 创建窗口(x, y, 宽, 高)
DispObj(img, wnd); // 显示原图
wnd.SetColor("red"); // 设置区域颜色
DispObj(connected_regions, wnd); // 叠加显示连通域
wnd.Click(); // 等待鼠标点击再关闭
} catch (HException &e) {
// 异常处理:打印错误信息
printf("错误:%s\n", e.ErrorMessage());
return 1;
}
return 0;
}
五、常见问题与解决
-
图像读取失败:检查路径是否正确,图像格式是否支持(Halcon 支持 bmp、png、jpg 等)。
-
阈值参数不合适:可在 HDevelop 中通过交互式调整阈值,再将参数应用到代码。
-
区域噪声多 :增加预处理步骤(如中值滤波
MedianImage)或形态学开运算(OpeningCircle)去除小区域。
六、扩展学习资源
-
官方文档:安装目录下的
help文件夹(含详细函数说明)。 -
工具:HDevelop(交互式调试,自动生成代码)。
-
应用场景:字符识别(
OCR)、尺寸测量(MeasurePos)、缺陷检测(Difference)等。