本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目基于C#与Halcon在VS2015环境中实现图像处理中的矩形绘制功能。Halcon作为工业视觉领域的强大工具,结合C#开发环境,可实现图像读取、窗口显示控制与用户交互绘制矩形等操作。项目代码经过精简模块化设计,分为图像处理与矩形选择两个核心类,便于理解和复用,适用于图像识别、区域选择等应用场景的开发与学习。
矩形绘制

1. Halcon图像处理基础

Halcon是由德国MVTec公司开发的专业机器视觉算法库,广泛应用于工业自动化、缺陷检测、尺寸测量和图像识别等领域。其强大的图像处理能力、丰富的算子库以及良好的跨平台支持,使其成为工业视觉开发中的首选工具之一。

本章将从图像处理的基本概念入手,讲解Halcon中图像的表示方式(如灰度图像、彩色图像、多通道图像)、图像类型(如byte、real、矢量字段等)及其应用场景。随后,我们将介绍Halcon中常用的图像处理函数,如图像滤波、边缘检测、形态学操作等,帮助读者构建图像处理的基本知识体系。

通过本章学习,读者将掌握Halcon开发环境的使用流程,包括图像读取、显示、处理的基本操作,为后续在C#中结合HWindowControl实现图形交互功能打下坚实基础。

2. VS2015与Halcon联合编程配置

在工业视觉和图像处理领域,Halcon作为一款功能强大的算法库,广泛用于图像识别、缺陷检测和自动测量等任务。而Visual Studio 2015(简称 VS2015)则是微软推出的一款经典的集成开发环境(IDE),支持多种编程语言,尤其是C#。将Halcon与VS2015结合使用,不仅可以利用Halcon的高效图像处理能力,还能借助C#语言的丰富界面支持,构建功能完善的视觉系统。

本章将详细介绍如何在VS2015中配置Halcon开发环境,包括开发环境的搭建、C#项目与Halcon接口的调用方式,以及联合编程中的调试与运行优化策略。通过本章内容,开发者将掌握如何在VS2015中正确引入Halcon库、调用相关API接口,并进行调试与性能优化,从而为后续图形交互功能的实现打下坚实基础。

2.1 开发环境搭建

要实现Halcon与VS2015的联合编程,首先必须搭建一个完整的开发环境。这包括Visual Studio 2015的安装、Halcon库的引入以及系统环境变量的配置。

2.1.1 Visual Studio 2015安装与配置

Visual Studio 2015是微软于2015年发布的一个稳定版本,支持.NET Framework 4.6,并兼容Halcon 12.x系列。安装VS2015的步骤如下:

  1. 下载安装包 :从微软官网或授权渠道获取VS2015的ISO镜像文件。
  2. 运行安装程序 :以管理员身份运行安装程序,选择“自定义安装”。
  3. 选择组件
    - 开发工具中勾选 “.NET桌面开发”。
    - 可选安装 “Visual C++” 和 “Windows SDK” 以支持底层开发。
  4. 完成安装 :根据提示完成安装后,重启系统。

安装完成后,建议更新至最新的Service Pack版本(SP3),以确保兼容性和稳定性。

2.1.2 Halcon库文件的引入与依赖设置

Halcon提供了C#的接口库(HALCON C# API),通常位于安装目录下的 bin lib 文件夹中。为了在C#项目中使用Halcon的功能,必须将相关的DLL文件引用到项目中。

步骤如下:

  1. 打开VS2015,创建一个新的C# Windows Forms Application项目。
  2. 在“解决方案资源管理器”中,右键点击“引用” → “添加引用”。
  3. 点击“浏览”,找到Halcon的C# DLL文件:
    - halcondll.dll
    - halcon.hdevelop.dll (如果使用HDevelop脚本)
  4. 选择后点击“添加”,完成引用。

注意 :确保选择的Halcon DLL版本与系统平台一致(x86/x64)。

2.1.3 系统环境变量配置注意事项

为了确保Halcon库在运行时能够被正确加载,还需要设置系统环境变量。具体操作如下:

  1. 打开环境变量设置界面
    - 右键“计算机” → “属性” → “高级系统设置” → “环境变量”。
  2. 添加Halcon库路径
    - 在“系统变量”中找到 Path ,点击“编辑”。
    - 添加Halcon的 bin 目录路径,例如: C:\Program Files\MVTec\HALCON-12.0\bin\x86-win64
  3. 重启开发环境 :设置完成后,重启VS2015以使环境变量生效。

建议 :为避免路径冲突,建议将Halcon安装路径设置为英文,避免使用中文或特殊字符。

2.2 C#项目与Halcon接口调用

完成开发环境搭建后,下一步是实现C#项目与Halcon接口的调用。Halcon提供了丰富的C# API接口,使得开发者能够方便地调用图像处理函数。

2.2.1 Halcon DLL在C#中的引用方式

Halcon的C#接口主要通过以下DLL文件实现:

DLL名称 功能说明
halcondll.dll 核心图像处理函数接口
halcon.hdevelop.dll 支持HDevelop脚本调用
hdevelopc.dll HDevelop编译器支持(可选)

在C#项目中,可以通过以下方式引用这些DLL:

using HalconDotNet;

注意 :该命名空间封装了Halcon的大部分API函数,是进行图像处理的核心接口。

2.2.2 常用命名空间与类库说明

Halcon的C# API封装在 HalconDotNet 命名空间中,常用的类包括:

  • HOperatorSet :提供Halcon所有操作函数的静态调用方式。
  • HWindow3D :3D窗口控制类。
  • HImage :图像处理类,用于加载、保存和显示图像。
  • HFramegrabber :图像采集设备控制类。
  • HTuple :通用数据类型容器,用于传递参数。

例如,加载一张图像的代码如下:

HImage image = new HImage();
image.ReadImage("C:/images/test.png");

参数说明
- "C:/images/test.png" :图像文件路径,必须为字符串类型。

2.2.3 接口函数调用示例与错误排查

以下是一个简单的Halcon图像读取与显示示例:

using HalconDotNet;
using System;

namespace HalconExample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                HOperatorSet.SetSystem("use_window_thread", "true");
                HWindow3D window = new HWindow3D();
                HImage image = new HImage();
                image.ReadImage("C:/images/test.png");

                window.SetWindowParam("display_axis", "true");
                window.DisplayImage(image);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
        }
    }
}

代码逻辑分析
- SetSystem :设置全局系统参数,启用窗口线程。
- HWindow3D :创建一个3D显示窗口。
- ReadImage :读取图像文件到HImage对象中。
- DisplayImage :在窗口中显示图像。

常见错误排查
- 找不到DLL :检查DLL是否被正确引用,并确认路径已加入系统环境变量。
- 图像路径错误 :确保路径正确,文件存在且可读。
- 窗口显示异常 :确认是否调用了 SetSystem 启用窗口线程。

2.3 联合编程的调试与运行

在开发过程中,调试与运行是验证功能实现的重要环节。本节将介绍在VS2015中调试Halcon程序的常见问题及解决方案,并提供一些性能优化策略。

2.3.1 调试模式下的常见问题与解决方案

1. 无法加载DLL文件

现象 :运行程序时报错 DllNotFoundException

解决方案
- 确认DLL路径是否已加入系统 Path
- 检查目标平台是否一致(x86/x64)。
- 将Halcon的 bin 目录复制到项目输出目录( bin\Debug bin\Release )。

2. 图像显示异常

现象 :图像加载成功但窗口不显示。

解决方案
- 检查是否调用了 SetSystem("use_window_thread", "true")
- 确保窗体或控制台应用中有事件循环支持窗口显示。

3. 内存泄漏或资源未释放

现象 :多次运行程序后系统资源占用升高。

解决方案
- 使用 Dispose() 方法手动释放图像和窗口对象。
- 避免在循环中频繁创建新对象。

2.3.2 运行时性能优化策略

1. 启用多线程处理

Halcon支持多线程加速图像处理。可通过以下方式启用:

HOperatorSet.SetSystem("parallelize_operators", "true");

效果 :开启后,Halcon将自动利用多核CPU并行处理图像运算。

2. 图像内存优化

对于大尺寸图像,建议使用 HImage SetImagePointer1 方法直接操作图像数据指针,减少内存拷贝。

3. 减少界面刷新频率

在实时图像处理应用中,频繁刷新窗口会影响性能。可通过以下方式优化:

window.SetWindowParam("flush_display", "false");

效果 :延迟刷新,提升绘制效率。

4. 预加载资源

在程序启动时,预加载常用图像、模型等资源,避免运行时频繁IO操作。

5. 使用Release模式编译

调试模式下性能较低,建议在正式运行时使用Release模式编译项目。

mermaid流程图示例:Halcon联合编程调试流程

graph TD
A[启动C#程序] --> B{是否加载DLL成功?}
B -- 是 --> C[初始化Halcon环境]
B -- 否 --> D[检查环境变量和引用路径]
C --> E{图像加载是否成功?}
E -- 是 --> F[调用Halcon函数处理]
E -- 否 --> G[检查图像路径和格式]
F --> H{窗口显示是否正常?}
H -- 是 --> I[运行成功]
H -- 否 --> J[启用窗口线程或检查资源释放]

本章通过详细的开发环境搭建、接口调用方法与调试优化策略,帮助开发者快速掌握在VS2015中集成Halcon的方法。下一章将介绍如何在C#窗体中嵌入HWindowControl控件,并实现图像显示与鼠标交互功能。

3. HWindowControl创建与窗口句柄获取

在Halcon与C#联合开发中, HWindowControl 是一个非常关键的控件,它作为图像显示的容器,能够将Halcon处理后的图像数据实时渲染到C#窗体界面中。本章将深入讲解如何在C#项目中正确添加和初始化 HWindowControl 控件,并探讨如何获取窗口句柄(HWND)以便后续与Halcon图像显示机制进行绑定。此外,还将实现一个基于鼠标事件的交互功能——矩形顶点选取,为后续章节中的图形绘制功能打下基础。

3.1 HWindowControl控件的添加与初始化

HWindowControl 是 Halcon 提供的一个 Windows Forms 控件,用于承载图像显示窗口。它是 HWindow3DControl 的简化版本,适用于二维图像的交互和展示。正确使用 HWindowControl 是实现图像显示和交互的第一步。

3.1.1 在C#窗体中嵌入HWindowControl控件

要在 C# WinForm 中使用 HWindowControl ,首先需要确保已经正确引入 Halcon 的 DLL 文件,并将控件添加到工具箱中。

操作步骤如下:

  1. 打开 Visual Studio 2015,创建一个新的 Windows Forms 应用程序项目。
  2. 在工具箱中右键,选择“选择项…”。
  3. 在“.NET Framework 组件”选项卡中点击“浏览”。
  4. 找到 Halcon 安装目录下的 halcondll.dll (通常位于 C:\Program Files\MVTec\HALCON-20.11\bin\dotnet35 )。
  5. 添加后, HWindowControl 控件将出现在工具箱中。
  6. 将控件拖拽到窗体设计界面中。

此时, HWindowControl 控件已成功嵌入窗体,接下来需要在代码中进行初始化。

private HWindow3D hWindow;

public Form1()
{
    InitializeComponent();
    // 初始化HWindowControl关联的HWindow3D对象
    hWindow = new HWindow3D();
    hWindow.SetWindowParam("display_axis", "true"); // 显示坐标轴
    hWindow.SetWindowParam("display_tooltips", "true"); // 显示提示信息
    // 将HWindowControl绑定到hWindow对象
    hWindowControl1.HWindow = hWindow;
}

代码逻辑说明:

  • HWindow3D 是 Halcon 提供的图像窗口类,支持2D/3D图像的显示。
  • SetWindowParam 用于设置窗口显示参数,例如是否显示坐标轴、是否启用提示信息。
  • hWindowControl1.HWindow = hWindow; 将控件与底层窗口对象绑定,使得图像可以在控件中显示。

3.1.2 控件属性设置与窗口尺寸调整

为了获得更好的显示效果,我们需要根据实际需求调整 HWindowControl 的外观属性和布局行为。

属性名 描述 推荐设置
Dock 控件的停靠方式 Fill(填充父容器)
AutoScroll 是否启用自动滚动条 True
BorderStyle 边框样式 Fixed3D
Size 初始尺寸 根据需求设定

示例代码:设置控件大小和停靠方式

public Form1()
{
    InitializeComponent();
    // 设置控件停靠方式
    hWindowControl1.Dock = DockStyle.Fill;
    // 设置控件自动滚动
    hWindowControl1.AutoScroll = true;
    // 设置控件边框样式
    hWindowControl1.BorderStyle = BorderStyle.Fixed3D;
}

通过上述设置,可以确保 HWindowControl 在不同分辨率或窗口缩放下保持良好的显示效果。

3.2 窗口句柄获取与图像显示绑定

在 Halcon 中,图像的显示依赖于底层的窗口句柄(HWND)。通过获取 HWindowControl 所在窗口的句柄,我们可以将 Halcon 的图像数据绑定到该窗口中进行显示。

3.2.1 获取窗口句柄的方法

在 C# 中,可以通过 Control.Handle 属性获取控件的 HWND。对于 HWindowControl ,我们可以通过其底层 HWindow3D 对象来获取句柄。

private void GetWindowHandle()
{
    IntPtr hwnd = hWindow.GetWindowHandle();
    MessageBox.Show("窗口句柄为:" + hwnd.ToString("X"));
}

参数说明:

  • GetWindowHandle() :Halcon 提供的函数,用于获取当前窗口的句柄。
  • IntPtr :用于封装平台特定的句柄类型。
  • ToString("X") :将句柄以十六进制格式输出。

应用场景:

  • 在进行图像叠加、绘图或与第三方库交互时,需要将 Halcon 图像绘制到指定 HWND 上。
  • 可用于实现与 OpenCV、DirectX 等图形库的图像共享。

3.2.2 图像与窗口控件的关联机制

Halcon 提供了 SetPart DisplayImage 等函数,用于将图像显示在指定的窗口中。

示例代码:显示一张 Halcon 图像

private void DisplaySampleImage()
{
    HObject image;
    HOperatorSet.ReadImage(out image, "fabrik"); // 读取示例图像
    // 设置显示区域为整个窗口
    hWindow.SetPart(0, 0, image.Width, image.Height);
    // 显示图像
    hWindow.DisplayImage(image);
}

代码逻辑分析:

  • ReadImage :读取 Halcon 内置图像 “fabrik”。
  • SetPart :设置图像显示区域,参数依次为:Row1, Column1, Row2, Column2。
  • DisplayImage :将图像显示在当前绑定的窗口上。

流程图示意:

graph TD
    A[读取图像] --> B[创建HWindow对象]
    B --> C[绑定到HWindowControl]
    C --> D[设置显示区域]
    D --> E[调用DisplayImage显示]

通过以上流程,我们完成了从图像读取到最终显示的完整过程。

3.3 鼠标事件交互实现矩形顶点选取

用户交互是图像处理系统中不可或缺的一部分。本节将介绍如何通过监听鼠标事件,在 HWindowControl 中实现矩形顶点的选取功能。

3.3.1 鼠标事件监听与回调函数注册

Halcon 提供了 SetMouseCallback 方法用于注册鼠标事件回调函数。

private void RegisterMouseCallback()
{
    hWindow.SetMouseCallback(MouseCallbackFunction);
}

private void MouseCallbackFunction(HWindow window, string type, int row, int column, int button)
{
    if (type == "down")
    {
        MessageBox.Show($"鼠标按下:Row={row}, Col={column}");
    }
}

参数说明:

  • window :触发事件的窗口对象。
  • type :事件类型,如 “down”(按下)、”up”(释放)、”move”(移动)。
  • row , column :事件发生的位置坐标。
  • button :按下的是哪个键(左键=1,中键=2,右键=3)。

注册回调后,每当用户在窗口中点击鼠标,就会触发相应的处理逻辑。

3.3.2 顶点坐标的获取与临时显示

我们可以在回调函数中记录每次点击的坐标,并将其临时显示在图像上。

private List<Point> points = new List<Point>();

private void MouseCallbackFunction(HWindow window, string type, int row, int column, int button)
{
    if (type == "down" && button == 1) // 左键点击
    {
        Point pt = new Point(column, row);
        points.Add(pt);
        // 显示点击点
        window.SetColor("red");
        window.DisplayCircle(row, column, 5); // 显示半径为5的圆点
    }
}

参数说明:

  • DisplayCircle :在指定位置绘制一个圆,用于标记顶点。
  • SetColor :设置绘图颜色。

效果说明:

每次点击图像,会在对应位置绘制一个红色圆点,并将该点保存至 points 列表中,供后续使用。

3.3.3 多次点击的坐标记录与逻辑控制

为了实现矩形顶点选取功能,我们需要控制点击次数,例如最多选择4个点形成矩形。

private const int MAX_POINTS = 4;

private void MouseCallbackFunction(HWindow window, string type, int row, int column, int button)
{
    if (type == "down" && button == 1)
    {
        if (points.Count < MAX_POINTS)
        {
            Point pt = new Point(column, row);
            points.Add(pt);
            window.SetColor("red");
            window.DisplayCircle(row, column, 5);
        }
        else
        {
            MessageBox.Show("已选择4个点,不能再继续选择!");
        }
    }
}

逻辑说明:

  • 限制最多选择4个点,超过则提示。
  • 每次点击后将点保存并绘制。
  • 后续可通过这4个点构建矩形模型。

流程图示意:

graph TD
    A[注册鼠标回调] --> B{点击次数 < 4?}
    B -->|是| C[添加点并绘制]
    B -->|否| D[提示已满]

该机制为后续章节中基于顶点构建矩形提供了数据基础。

小结:

本章围绕 HWindowControl 的创建与窗口句柄的获取展开,详细介绍了控件的添加、初始化、属性设置以及图像显示机制。同时,通过鼠标事件的注册与处理,实现了基础的交互功能——矩形顶点选取。这些内容为后续章节中图形绘制、图像处理与交互功能的实现提供了坚实的技术基础。

4. 基于Halcon的矩形绘制功能实现

在工业视觉和图像处理应用中,图形的绘制与交互是实现用户图形操作和数据可视化的重要手段。Halcon提供了丰富的图像绘制函数,其中 CreateRectangle2 DisplayShape 是绘制矩形的关键函数。本章将围绕如何使用 Halcon 实现矩形绘制功能展开,涵盖矩形对象的创建、图形绘制流程、样式设置、绘制刷新机制,以及代码的模块化设计与复用策略。通过本章内容,读者将掌握基于 Halcon 的图形交互开发流程,并能够构建具有实际工程意义的绘图功能模块。

4.1 CreateRectangle2函数创建矩形对象

在 Halcon 中, CreateRectangle2 函数用于创建一个矩形对象。与简单的矩形绘制不同,该函数创建的矩形对象可以用于后续的几何操作、测量分析等高级功能。它不仅描述了矩形的形状,还保留了矩形的参数化表示,便于程序进行进一步处理。

4.1.1 矩形对象的参数定义与坐标计算

CreateRectangle2 函数的基本语法如下:

HOperatorSet.CreateRectangle2(out HObject ho_Rectangle, double row, double column, double phi, double length1, double length2);
参数名 类型 含义说明
ho_Rectangle HObject 输出矩形对象
row double 矩形中心点的行坐标(Y轴)
column double 矩形中心点的列坐标(X轴)
phi double 矩形旋转角度(单位:弧度)
length1 double 矩形沿主方向的半长度(宽度的一半)
length2 double 矩形沿次方向的半长度(高度的一半)

矩形对象由中心点、旋转角度和两个半长度定义,这使得它可以表示任意方向和大小的矩形。例如,若希望绘制一个中心在 (250, 300)、宽 100、高 50、无旋转的矩形,则调用如下:

HObject ho_Rect;
HOperatorSet.CreateRectangle2(out ho_Rect, 250, 300, 0, 50, 25);

此调用创建了一个矩形对象,后续可以通过 DisplayShape 将其绘制到图像窗口中。

4.1.2 使用CreateRectangle2函数构建矩形模型

在实际应用中,矩形往往不是固定的,而是根据用户交互或图像处理结果动态生成。例如,用户通过鼠标点击选择两个点,系统计算出矩形的中心点、角度和尺寸。

下面是一个示例:根据两个点坐标构建矩形对象:

public HObject CreateDynamicRectangle(double x1, double y1, double x2, double y2)
{
    double centerX = (x1 + x2) / 2;
    double centerY = (y1 + y2) / 2;
    double width = Math.Abs(x2 - x1);
    double height = Math.Abs(y2 - y1);
    double angle = Math.Atan2(y2 - y1, x2 - x1);  // 计算旋转角度

    HObject rect;
    HOperatorSet.CreateRectangle2(out rect, centerY, centerX, angle, width / 2, height / 2);

    return rect;
}

该函数接收两个点坐标,计算出中心点、宽高和角度,并生成对应的矩形对象。该模型可用于图形标注、ROI区域定义等场景。

4.2 DisplayShape函数绘制图形

在 Halcon 中, DisplayShape 是一个用于绘制图形的通用函数,支持矩形、圆、椭圆、多边形等图形对象的显示。它的主要作用是将之前创建的图形对象(如 ho_Rectangle )绘制到图像窗口中。

4.2.1 图形绘制的基本流程

使用 DisplayShape 绘制图形的基本流程如下:

  1. 创建图形对象(如使用 CreateRectangle2
  2. 设置绘制样式(如颜色、线型等)
  3. 调用 DisplayShape 函数进行绘制

示例代码如下:

HObject ho_Rect;
HOperatorSet.CreateRectangle2(out ho_Rect, 250, 300, 0, 50, 25);

HTuple displayStyle = "fill"; // 可选值:fill, margin, line
HTuple color = "red";
HOperatorSet.SetColor(hWindow3D, color);
HOperatorSet.DisplayShape(hWindow3D, ho_Rect, displayStyle);

在这个流程中,首先创建了一个矩形对象,然后设置颜色为红色,并使用 DisplayShape 函数将矩形填充绘制到窗口中。

4.2.2 绘制样式与颜色设置

DisplayShape 支持多种绘制样式,通过 displayStyle 参数控制:

  • "fill" :填充整个图形区域
  • "margin" :仅绘制边框
  • "line" :以线条形式绘制

此外, SetColor 函数用于设置当前绘制颜色,支持多种颜色表示方式,包括名称(如 "red" )、RGB值(如 "#FF0000" )等。

graph TD
    A[创建图形对象] --> B[设置绘制样式]
    B --> C[设置颜色]
    C --> D[调用DisplayShape]
    D --> E[图形显示到窗口]

4.2.3 实时绘制与刷新机制

在交互式应用中,图形绘制需要支持实时更新。例如,用户拖动鼠标绘制矩形时,矩形应随着鼠标移动而实时更新。实现这一功能的关键在于:

  1. 每次鼠标移动时重新计算矩形对象
  2. 清除窗口中旧的图形
  3. 重新绘制新的矩形

下面是一个实时绘制矩形的示例逻辑:

private void MouseMoveHandler(double x, double y)
{
    // 清除窗口中已有图形
    HOperatorSet.ClearWindow(hWindow3D);

    // 重绘原始图像
    HOperatorSet.DisplayImage(image, hWindow3D);

    // 构建矩形并绘制
    HObject rect = CreateDynamicRectangle(startX, startY, x, y);
    HOperatorSet.SetColor(hWindow3D, "blue");
    HOperatorSet.DisplayShape(hWindow3D, rect, "margin");
}

每次鼠标移动时,清除窗口、重绘背景图像、重新计算并绘制矩形,实现动态刷新效果。这种方式可以用于图像标注、ROI绘制、图形编辑等交互场景。

4.3 精简代码模块化设计与复用

为了提高代码的可维护性和复用性,在开发图形绘制功能时应采用模块化设计思想,将功能封装为独立的方法或类,便于后续扩展和维护。

4.3.1 功能模块划分与接口设计

图形绘制功能可以划分为以下几个模块:

模块名称 职责说明
RectangleBuilder 负责矩形对象的创建与参数计算
ShapeDrawer 负责图形样式设置与绘制
InteractionHandler 处理鼠标事件与图形更新逻辑

每个模块对外提供清晰的接口,便于调用和集成。

4.3.2 矩形绘制功能封装与调用

将矩形绘制功能封装为一个独立的类 RectangleDrawer ,提供统一的调用接口:

public class RectangleDrawer
{
    private HWindow3D hWindow;

    public RectangleDrawer(HWindow3D window)
    {
        hWindow = window;
    }

    public void DrawRectangle(double x1, double y1, double x2, double y2, string color = "red", string style = "margin")
    {
        HObject rect = CreateRectangle(x1, y1, x2, y2);
        HOperatorSet.SetColor(hWindow, color);
        HOperatorSet.DisplayShape(hWindow, rect, style);
    }

    private HObject CreateRectangle(double x1, double y1, double x2, double y2)
    {
        double centerX = (x1 + x2) / 2;
        double centerY = (y1 + y2) / 2;
        double width = Math.Abs(x2 - x1);
        double height = Math.Abs(y2 - y1);
        double angle = Math.Atan2(y2 - y1, x2 - x1);

        HObject rect;
        HOperatorSet.CreateRectangle2(out rect, centerY, centerX, angle, width / 2, height / 2);
        return rect;
    }
}

调用示例如下:

RectangleDrawer drawer = new RectangleDrawer(hWindow3D);
drawer.DrawRectangle(100, 100, 200, 200, "green", "fill");

该封装方式提高了代码的可读性和复用性,便于在多个项目中重复使用。

4.3.3 代码复用性与可维护性提升策略

为了进一步提升代码的复用性和可维护性,可以采用以下策略:

  • 泛型图形绘制类 :将 RectangleDrawer 扩展为支持圆、椭圆等图形的 ShapeDrawer 类。
  • 配置化样式参数 :将颜色、线型等参数提取为配置文件或用户设置项。
  • 事件驱动机制 :将鼠标事件与图形绘制逻辑解耦,通过事件总线进行通信。
  • 单元测试支持 :对图形创建与绘制逻辑进行单元测试,确保代码稳定性。

通过这些策略,可以将图形绘制功能构建成一个稳定、可扩展的组件,适应不同项目的需求。

5. Halcon图像加载与版本兼容性优化

5.1 图像加载与显示流程

5.1.1 使用C#中Bitmap读取图像

在C#环境中,图像通常以 Bitmap 对象的形式进行处理。为了将图像传递给Halcon进行后续处理,首先需要使用 System.Drawing.Bitmap 类读取图像文件。以下是一个典型的读取图像代码示例:

using System.Drawing;

// 读取图像
string imagePath = @"C:\Images\sample.jpg";
Bitmap bitmap = new Bitmap(imagePath);

// 检查图像是否成功加载
if (bitmap == null)
{
    Console.WriteLine("图像加载失败!");
}
else
{
    Console.WriteLine($"图像尺寸:{bitmap.Width} x {bitmap.Height}");
}

参数说明
- imagePath :图像的完整路径。
- Bitmap :用于存储图像的位图对象。

5.1.2 图像数据转换与Halcon图像对象创建

Halcon的图像处理接口主要使用 HObject HImage 类。为了将 Bitmap 对象转换为Halcon图像对象,需要进行像素数据的转换。以下是一个将 Bitmap 转换为 HObject 的封装函数示例:

using HalconDotNet;

public HObject ConvertBitmapToHObject(Bitmap bitmap)
{
    HObject hObject;
    HTuple width = bitmap.Width;
    HTuple height = bitmap.Height;
    HTuple type = "byte";
    HTuple numChannels = 3; // 假设是RGB图像

    HOperatorSet.GenImageInterleaved(out hObject, bitmap.LockBits(
        new Rectangle(0, 0, bitmap.Width, bitmap.Height),
        ImageLockMode.ReadOnly,
        PixelFormat.Format24bppRgb), "rgb", width, height, -1, "byte", 0, 0, 0, 0);
    bitmap.UnlockBits(bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height),
        ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb));

    return hObject;
}

函数说明
- 使用 GenImageInterleaved 函数将RGB像素数据封装为Halcon图像对象。
- LockBits 方法用于获取图像的原始像素数据指针。
- 转换后的 HObject 可用于Halcon后续的图像处理操作。

5.1.3 图像显示的坐标变换与缩放处理

图像加载完成后,通常需要在窗口中进行显示。为了适配窗口尺寸,需要对图像进行缩放和坐标变换。以下代码演示如何在HWindowControl控件中显示图像:

HWindow3D window = hWindowControl1.HWindow3D;
HObject image = ConvertBitmapToHObject(bitmap);

// 获取窗口大小
HTuple windowWidth, windowHeight;
window.GetWindowExtents(out windowHeight, out windowWidth);

HTuple imageWidth, imageHeight;
HOperatorSet.GetImageSize(image, out imageWidth, out imageHeight);

// 缩放比例计算
double scale = Math.Min(windowWidth / imageWidth, windowHeight / imageHeight);

// 缩放并显示图像
HOperatorSet.SetSystem("use_window_thread", "true");
window.SetPart(0, 0, imageHeight * scale, imageWidth * scale);
window.DisplayImage(image);

逻辑分析
- GetWindowExtents 获取窗口尺寸, GetImageSize 获取图像尺寸。
- 通过比例缩放确保图像完整显示。
- DisplayImage 用于在窗口中绘制图像。

5.2 Halcon环境初始化与资源管理

5.2.1 初始化HOperatorSet与图像窗口

在调用Halcon函数前,需要初始化 HOperatorSet 环境。通常在程序启动时进行初始化:

HOperatorSet.SetSystem("parallelize_operators", "true");
HOperatorSet.SetSystem("use_window_thread", "true");

说明
- 启用并行操作可提高图像处理效率。
- 使用窗口线程可避免UI冻结。

5.2.2 资源释放与内存管理机制

Halcon对象如 HObject HImage 等在使用完毕后需要手动释放,否则可能导致内存泄漏。以下为释放资源的示例:

if (image.IsInitialized())
{
    image.Dispose();
}

注意事项
- 在C#中建议使用 using 语句或 Dispose 方法手动释放资源。
- 避免在循环或频繁调用中遗漏释放操作。

5.3 Halcon 12版本兼容性注意事项

5.3.1 Halcon 12与VS2015的兼容性分析

Halcon 12版本支持Visual Studio 2015,但需要注意以下几点:

Halcon 12特性 VS2015兼容性
.NET接口 完全支持
32位/64位支持 支持
C++接口 支持
多线程支持 支持

建议 :使用Halcon 12.0.2及以上版本以获得更好的兼容性支持。

5.3.2 接口变动与函数替代方案

Halcon 12中部分函数在后续版本中被弃用,需使用新函数替代。例如:

旧函数名 新函数名 说明
read_image read_image (无变化) 保持兼容
display_image HWindow3D.DisplayImage 新版本推荐使用窗口类方法
get_image_pointer1 get_image_pointer1 (无变化) 保持兼容

提示 :可通过Halcon官方文档查询函数变更记录。

5.3.3 常见兼容性问题及解决方法

  • 问题1:DLL加载失败
  • 原因 :未正确配置环境变量或缺少运行库。
  • 解决方法 :安装VC++运行库,并将Halcon的 bin 目录加入系统PATH。

  • 问题2:函数调用异常

  • 原因 :函数参数类型不匹配或接口变更。
  • 解决方法 :检查函数签名,使用HDevelop验证函数用法。

  • 问题3:图像显示异常

  • 原因 :未正确设置窗口线程或图像未释放。
  • 解决方法 :确保调用 SetSystem("use_window_thread", "true") ,并在每次显示前清理窗口内容。
graph TD
    A[程序启动] --> B[初始化HOperatorSet]
    B --> C[加载图像文件]
    C --> D[图像格式转换]
    D --> E[图像显示]
    E --> F{是否退出?}
    F -- 是 --> G[释放资源]
    F -- 否 --> H[继续处理]
    G --> I[程序结束]
    H --> E

流程图说明
- 图像加载与显示是一个循环流程,资源管理贯穿整个生命周期。
- 退出前必须释放所有Halcon对象以避免内存泄漏。

(本章完)

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:本项目基于C#与Halcon在VS2015环境中实现图像处理中的矩形绘制功能。Halcon作为工业视觉领域的强大工具,结合C#开发环境,可实现图像读取、窗口显示控制与用户交互绘制矩形等操作。项目代码经过精简模块化设计,分为图像处理与矩形选择两个核心类,便于理解和复用,适用于图像识别、区域选择等应用场景的开发与学习。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

更多推荐