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; // 20fps
grabTimer.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资源
-
性能优化:对于高速采集,可能需要使用多线程或异步处理