首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于C#和Halcon实现的鼠标控制图片缩放、拖动以及ROI绘制

基于C#和Halcon实现的鼠标控制图片缩放、拖动以及ROI绘制

原创
作者头像
用户4006703
发布2025-08-13 13:15:06
发布2025-08-13 13:15:06
1.3K0
举报

基于C#和Halcon实现的鼠标控制图片缩放、拖动以及ROI绘制

1. 环境准备

确保你已经安装了Halcon开发环境,并在C#项目中引用了Halcon的DLL文件。

2. 创建WinForm项目

  1. 打开Visual Studio,创建一个新的WinForm项目。
  2. 在项目中添加Halcon的控件HWindowControl

3. 实现代码

3.1 图片缩放功能
代码语言:csharp
复制
private void hWindowControl1_HMouseWheel(object sender, HMouseEventArgs e)
{
    double zoomFactor = e.Delta > 0 ? 1.1 : 0.9;
    HOperatorSet.GetMposition(hWindowControl1.HalconWindow, out int row, out int col, out _);
    HOperatorSet.GetPart(hWindowControl1.HalconWindow, out int row1, out int col1, out int row2, out int col2);
    int h = row2 - row1;
    int w = col2 - col1;
​
    if (h * w < 32000 * 32000 || zoomFactor == 1.1)
    {
        double r1 = row1 + ((1 - (1.0 / zoomFactor)) * (row - row1));
        double c1 = col1 + ((1 - (1.0 / zoomFactor)) * (col - col1));
        double r2 = r1 + (h / zoomFactor);
        double c2 = c1 + (w / zoomFactor);
​
        HOperatorSet.SetPart(hWindowControl1.HalconWindow, r1, c1, r2, c2);
        hWindowControl1.HalconWindow.ClearWindow();
        hWindowControl1.HalconWindow.DispObj(image);
    }
}
3.2 图片拖动功能
代码语言:csharp
复制
private bool isDragging = false;
private Point dragStartPos;
​
private void hWindowControl1_HMouseDown(object sender, HMouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        isDragging = true;
        dragStartPos = new Point(e.X, e.Y);
    }
}
​
private void hWindowControl1_HMouseMove(object sender, HMouseEventArgs e)
{
    if (isDragging)
    {
        int deltaX = e.X - dragStartPos.X;
        int deltaY = e.Y - dragStartPos.Y;
​
        hWindowControl1.HalconWindow.GetPart(out int row1, out int col1, out int row2, out int col2);
        hWindowControl1.HalconWindow.SetPart(row1 - deltaY, col1 - deltaX, row2 - deltaY, col2 - deltaX);
        hWindowControl1.HalconWindow.DispObj(image);
​
        dragStartPos = new Point(e.X, e.Y);
    }
}
​
private void hWindowControl1_HMouseUp(object sender, HMouseEventArgs e)
{
    isDragging = false;
}
3.3 ROI绘制功能
代码语言:csharp
复制
private HObject selectedRegion;
​
private void btnSelectROI_Click(object sender, EventArgs e)
{
    hWindowControl1.HalconWindow.DrawRectangle1(out double row1, out double col1, out double row2, out double col2);
    HOperatorSet.GenRectangle1(out selectedRegion, row1, col1, row2, col2);
    hWindowControl1.HalconWindow.SetColor("red");
    hWindowControl1.HalconWindow.DispObj(selectedRegion);
}

4. 注册事件

在窗体的构造函数中注册上述事件:

代码语言:csharp
复制
public MainForm()
{
    InitializeComponent();
    hWindowControl1.HMouseWheel += hWindowControl1_HMouseWheel;
    hWindowControl1.HMouseDown += hWindowControl1_HMouseDown;
    hWindowControl1.HMouseMove += hWindowControl1_HMouseMove;
    hWindowControl1.HMouseUp += hWindowControl1_HMouseUp;
}

5. 加载图片

在窗体中添加一个按钮,用于加载图片:

代码语言:csharp
复制
private void btnLoadImage_Click(object sender, EventArgs e)
{
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "所有图像文件 (*.bmp;*.pcx;*.png;*.jpg;*.gif;*.tif;*.ico;*.dxf;*.cgm;*.cdr;*.wmf;*.eps;*.emf)|*.bmp;*.pcx;*.png;*.jpg;*.gif;*.tif;*.ico;*.dxf;*.cgm;*.cdr;*.wmf;*.eps;*.emf";
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        HOperatorSet.ReadImage(out HObject image, openFileDialog.FileName);
        hWindowControl1.HalconWindow.DispObj(image);
    }
}

6. 运行程序

运行程序后,你可以通过鼠标滚轮实现图片的缩放,按住鼠标左键拖动图片,以及通过按钮绘制ROI区域。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 1. 环境准备
  • 2. 创建WinForm项目
  • 3. 实现代码
    • 3.1 图片缩放功能
    • 3.2 图片拖动功能
    • 3.3 ROI绘制功能
  • 4. 注册事件
  • 5. 加载图片
  • 6. 运行程序
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档