Halcon 学习笔记

一、Halcon 简介

Halcon 是由德国 MVTec 公司开发的机器视觉算法库,专注于图像处理与分析,广泛应用于工业检测、医疗成像、机器人视觉等领域。其核心优势包括:

  • 功能全面:涵盖图像获取、预处理、分割、特征提取、识别、测量等全流程算法。

  • 跨平台性:支持 Windows、Linux、macOS 等系统,可与 C/C++、C#、Python 等语言集成。

  • 灵活性:提供交互式开发环境 HDevelop,支持算法快速原型设计,再导出为目标语言代码。

  • 高性能:针对大规模图像和实时场景优化,支持多核计算、GPU 加速。

二、核心概念与数据类型

  1. 图像(Image)

    存储像素数据的对象,支持单通道(灰度图)、多通道(RGB 等),数据类型包括 byte(0-255)、uint2(16 位无符号)等。

    • 变量类型:Hobject(Halcon 通用对象类型,可存储图像、区域等)。
  2. 区域(Region)

    由连通像素组成的集合,是 Halcon 中特有的概念,用于表示图像中的感兴趣区域(ROI)。

    • 常用操作:阈值分割(threshold)、连通域提取(connection)、形态学运算(erosion/dilation)等。
  3. 其他关键类型

    • Hlong:Halcon 长整型,用于计数、索引等。

    • HTuple:动态数据容器,可存储数值、字符串等,方便参数传递。

三、基本工作流程

  1. 图像获取:读取本地图像或从相机采集。

  2. 预处理 :去噪(mean_image)、增强对比度(emphasize)等。

  3. 区域分割:通过阈值、边缘检测等提取目标区域。

  4. 特征分析:计算区域的面积、周长、中心坐标等。

  5. 结果输出:显示、计数或控制外部设备。

四、示例代码(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, &region, 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;
}

五、常见问题与解决

  1. 图像读取失败:检查路径是否正确,图像格式是否支持(Halcon 支持 bmp、png、jpg 等)。

  2. 阈值参数不合适:可在 HDevelop 中通过交互式调整阈值,再将参数应用到代码。

  3. 区域噪声多 :增加预处理步骤(如中值滤波 MedianImage)或形态学开运算(OpeningCircle)去除小区域。

六、扩展学习资源

  • 官方文档:安装目录下的 help 文件夹(含详细函数说明)。

  • 工具:HDevelop(交互式调试,自动生成代码)。

  • 应用场景:字符识别(OCR)、尺寸测量(MeasurePos)、缺陷检测(Difference)等。

相关推荐
伯明翰java5 小时前
Redis学习笔记-List列表(2)
redis·笔记·学习
云帆小二5 小时前
从开发语言出发如何选择学习考试系统
开发语言·学习
Elias不吃糖5 小时前
总结我的小项目里现在用到的Redis
c++·redis·学习
BullSmall5 小时前
《道德经》第六十三章
学习
AA陈超6 小时前
使用UnrealEngine引擎,实现鼠标点击移动
c++·笔记·学习·ue5·虚幻引擎
BullSmall6 小时前
《道德经》第六十二章
学习
Knox_Lai6 小时前
数据结构与算法学习(0)-常见数据结构和算法
c语言·数据结构·学习·算法
扶尔魔ocy7 小时前
【QT opencv】使用创建副本.clone()的场景
人工智能·opencv·计算机视觉
IMPYLH7 小时前
Lua 的 assert 函数
开发语言·笔记·junit·单元测试·lua
离离茶7 小时前
【笔记1-8】Qt bug记录:QListWidget窗口的浏览模式切换为ListMode后,滚轮滚动速度变慢
笔记·qt·bug