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資源
-
性能優化:對于高速采集,可能需要使用多線程或異步處理