Halcon是一款强大的机器视觉软件,结合C#可以开发出功能完善的视觉应用程序。
基本设置
确保已经安装了Halcon和Halcon的.NET库(HalconDotNet)。
1. 添加引用
在C#项目中,需要添加对HalconDotNet.dll的引用:
-
右键点击项目 -> 添加 -> 引用
-
浏览找到Halcon安装目录下的HalconDotNet.dll(通常位于
%HALCONROOT%\bin\dotnet35
)
相机采集代码实现
2. 基本采集代码
using HalconDotNet;
using System;
using System.Windows.Forms;public class HalconCamera
{private HWindowControl hWindowControl;private HTuple hv_AcqHandle;private HImage hv_Image;public HalconCamera(HWindowControl windowControl){hWindowControl = windowControl;}// 初始化相机public void InitCamera(){try{// 查找可用相机HTuple hv_Info;HOperatorSet.InfoFramegrabber("DirectShow", "device", out hv_Info, out _);// 打开第一个找到的相机HOperatorSet.OpenFramegrabber("DirectShow", 1, 1, 0, 0, 0, 0, "default", 8, "rgb", -1, "false", "default", "[0] ", 0, -1, out hv_AcqHandle);// 设置相机参数HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "grab_timeout", -1);}catch (HalconException ex){MessageBox.Show("相机初始化失败: " + ex.Message);}}// 开始连续采集public void StartGrabbing(){try{HOperatorSet.GrabImageStart(hv_AcqHandle, -1);// 使用定时器或线程连续抓取图像Timer grabTimer = new Timer();grabTimer.Interval = 50; // 20fpsgrabTimer.Tick += (s, e) => GrabImage();grabTimer.Start();}catch (HalconException ex){MessageBox.Show("开始采集失败: " + ex.Message);}}// 抓取单帧图像public void GrabImage(){try{hv_Image = new HImage();HOperatorSet.GrabImageAsync(out hv_Image, hv_AcqHandle, -1);// 显示图像HOperatorSet.DispObj(hv_Image, hWindowControl.HalconWindow);}catch (HalconException ex){MessageBox.Show("图像采集失败: " + ex.Message);}}// 停止采集并释放资源public void CloseCamera(){try{if (hv_AcqHandle != null){HOperatorSet.CloseFramegrabber(hv_AcqHandle);hv_AcqHandle = null;}}catch (HalconException ex){MessageBox.Show("关闭相机失败: " + ex.Message);}}// 获取当前图像public HImage GetCurrentImage(){return hv_Image;}
}
3. 在WinForms中使用
在WinForms窗体中添加一个HWindowControl控件,然后使用上面的类:
public partial class MainForm : Form
{private HalconCamera halconCamera;public MainForm(){InitializeComponent();halconCamera = new HalconCamera(hWindowControl1);}private void btnStart_Click(object sender, EventArgs e){halconCamera.InitCamera();halconCamera.StartGrabbing();}private void btnStop_Click(object sender, EventArgs e){halconCamera.CloseCamera();}private void btnGrabSingle_Click(object sender, EventArgs e){halconCamera.GrabImage();}private void MainForm_FormClosing(object sender, FormClosingEventArgs e){halconCamera.CloseCamera();}
}
4. 相机参数设置
public void SetCameraParameters(double exposure, double gain)
{try{HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "exposure", exposure);HOperatorSet.SetFramegrabberParam(hv_AcqHandle, "gain", gain);}catch (HalconException ex){MessageBox.Show("设置相机参数失败: " + ex.Message);}
}
5. 保存图像
public void SaveImage(string filePath)
{try{if (hv_Image != null){hv_Image.WriteImage("tiff", 0, filePath);}}catch (HalconException ex){MessageBox.Show("保存图像失败: " + ex.Message);}
}
6. 多相机支持
public List<string> GetAvailableCameras()
{List<string> cameras = new List<string>();try{HTuple hv_Info;HOperatorSet.InfoFramegrabber("DirectShow", "device", out hv_Info, out _);for (int i = 0; i < hv_Info.Length; i++){cameras.Add(hv_Info[i].S);}}catch (HalconException ex){MessageBox.Show("获取相机列表失败: " + ex.Message);}return cameras;
}
注意事项
-
Halcon许可证:确保有合法的Halcon开发许可证
-
相机接口:根据相机类型选择合适的接口(DirectShow, GigEVision, USB3Vision等)
-
异常处理:妥善处理所有可能的异常,特别是在工业环境中
-
资源释放:确保在程序退出时释放所有Halcon资源
-
性能优化:对于高速采集,可能需要使用多线程或异步处理