採用HALCON機器視覺軟體及C#語言檢測工件位置的方法 (之二)
二.HALCON與C#混合編程的方法
1. HALCON軟體的特點
HALCON是德國MVtec公司開發的一套完善的機器視覺演算法包,擁有靈活的機器視覺集成開發環境,用戶可快速完成圖像處理與分析的開發工作。在歐洲以及日本工業界公認HALCON軟體是最佳機器視覺軟體。
HALCON軟體有一千多個獨立的函數,其中包含了各類濾波、幾何轉換、形態學計算分析、校正、分類辨識、形狀搜尋等功能,應用範圍涵蓋工業監控、自動化檢測、醫學檢測、遙感探測等領域。
HALCON軟體支持Windows、Linux和Mac OS X操作環境。整個函數庫可以用C、C++、C#、Visual basic和Delphi等多種編程語言調用。HALCON軟體為百餘種工業相機和圖像採集卡提供了介面。
HALCON軟體提供了一套互動式程序開發工具HDevelop,可在其中以HALCON程序代碼直接編寫、修改、執行程序,並且可以查看計算過程中的所有變數。設計、調試完成後,可以直接輸出C、C++、VB、C#等程序代碼,嵌入用戶的程序中。
HDevelop提供了數百個常式。可以根據應用範圍、應用領域、函數類型3個途徑檢索到合適的常式。此外,HDevelop還配有以問題為導向的手冊和在線幫忙功能。
2. 一個完整的HALCON程序
HALCON程序和BASIC語言類似,函數名直接反映函數功能,容易理解。下面的程序是用大恆相機循環抓取圖像並顯示。星號後的文字是注釋。
* 關閉所有圖像抓取設備:
close_all_framegrabbers()
* 以默認設置參數打開相機:
open_framegrabber
(DahengCAM, 1, 1, 0, 0, 0, 0, default, -1, default, -1, default, default, default, -1, -1, AcqHandle)* 關閉窗體:
dev_close_window ()
* 新建一個窗體:
dev_open_window (0, 0,427, 341, black, WindowID)
*循環體開始:
while(1)
* 由相機抓取一幅圖像
grab_image (Image, AcqHandle)
* 獲取圖像尺寸
get_image_size(Image,Width, Height)
* 調整圖像大小以適應窗體
dev_set_part(0,0, Height-1,Width-1)
* 在窗體中顯示圖像
dev_display(Image)
* 循環體結束
Endwhile
* 關閉指定相機:
close_framegrabber (AcqHandle)
圖9 HDevelop界面、HALCON程序和圖像顯示窗體
3. 導出C#代碼
在HDevelop界面中點擊「文件」->「導出」。 參數配置最好如圖10所示。
圖10 「導出」界面
導出的C#程序代碼如下:
//
// File generated by HDevelop for HALCON/DOTNET (C#) Version 10.0
//
// This file is intended to be used with the HDevelopTemplate or
// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%c#
using System;
using HalconDotNet;
public partial
class HDevelopExport{
public HTuple hv_ExpDefaultWinHandle;
// Main procedure
private void action()
{
// Local iconic variables
HObject ho_Image=null;
// Local control variables
HTuple hv_AcqHandle, hv_Width=new HTuple();
HTuple hv_Height=new HTuple();
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Image);
//Close all image acquisition devices:
HOperatorSet.CloseAllFramegrabbers();
//open camera with default settings:
HOperatorSet.OpenFramegrabber("DahengCAM", 1, 1, 0, 0, 0, 0,"default", -1, "default", -1, "default","default", "default", -1, -1, out hv_AcqHandle);
//Close the active graphics window:
//dev_close_window(...);
//Open a new graphics window:
//dev_open_window(...);
//Starts a loop block:
while ((int)(1) != 0)
{
//Grab an image from the specified image acquisition device:
ho_Image.Dispose();
HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle);
//Return the size of an image:
HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
//Modify the displayed image part:
HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_Height-1,hv_Width-1);
//Displays image objects in the current graphics window:
HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
//End of while loop
}
//Close specified image acquisition device:
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
}
public void InitHalcon()
{
// Default settings used in HDevelop
HOperatorSet.SetSystem("do_low_error", "false");
}
public void RunHalcon(HTuple Window)
{
hv_ExpDefaultWinHandle = Window;
action();
}
}
注意:
HALCON程序中的關閉窗體、打開窗體的函數dev_close_window ()和dev_open_window (),並沒有直接翻譯成C#語句。
和窗體相關的C#語句是程序倒數第2行的hv_ExpDefaultWinHandle = Window;
4. C#編程
從HALCON導出的C#程序並不能直接使用,需要自己調整、修改。下面給出在C#中調用HALCON函數的詳細步驟。
1)打開VS2010,新建項目?windows窗體應用程序。
2)在設計界面的左邊,將工具箱拉到最後,在常規選項卡空白處點右鍵,然後點「選擇項」,在.NET
Framework處點瀏覽,找到Halcon的安裝目錄,選Bindotnet35halcondotnet.dll,點「打開」,然後點「確定」。如圖11所示。圖11 添加halcon的動態鏈接庫
3)將HWindowControl控制項拖進窗體,這就是Halcon的圖像顯示框。窗體的長寬比例要為5:4,和攝像頭拍攝的圖像比例相同。然後再拖入2個按鍵控制項、1個定時器。如圖12所示。
圖12 設計Form,添加halcon圖像顯示框
4)將導出的C#代碼中的using
HalconDotNet; 拷貝至Program.cs中的using System5)將導出的C#代碼中的類HDevelopExport和變數的定義拷貝至命名空間中。
public partial class HDevelopExport
{
public HTuple hv_ExpDefaultWinHandle;
// Local iconic variables
HObject ho_Image=null;
// Local control variables
HTuple hv_AcqHandle, hv_Width, hv_Height;
}
6)將導出的C#代碼分解為幾個功能獨立的方法,並拷貝至HDevelopExport類中。
public void InitHalcon() // 初始化Halcon
{
// Default settings used in HDevelop
HOperatorSet.SetSystem("do_low_error", "false");
}
public void InitCamera(HTuple Window) // 攝像頭初始化
{
hv_ExpDefaultWinHandle = Window;
// Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Image); // 生成ho_Image數據區
HOperatorSet.CloseAllFramegrabbers();
//open camera with default settings:
HOperatorSet.OpenFramegrabber("DahengCAM", 1, 1, 0, 0, 0, 0, "default", -1, "default", -1, "default", "default", "default", -1, -1, out hv_AcqHandle);
}
public void GrabAndDisplay() // 圖像抓取與顯示
{
// Grabbing images from a Daheng USB 2.0 camera
ho_Image.Dispose(); // 清除ho_Image中的數據
HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle); // 採集圖像
HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
// 獲取圖像的尺寸
HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_Height - 1, hv_Width - 1);
// 調整圖像的大小
HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle); // 顯示圖像
}
public void CloseCamera() // 關閉相機
{
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
}
7)在Form1.cs中實例化HDevelopExport類。
public partial class Form1 : Form
{
HDevelopExport hd = new
HDevelopExport(); // 實例化HDevelopExportpublic Form1()
{
..........
8)在按鍵和定時器的事件中調用HDevelopExport類的過程。
private void button1_Click(object sender, EventArgs e)
{
hd.InitCamera(hWindowControl1.HalconWindow);// 攝像頭初始化
timer1.Enabled = true; // 開始定時拍照顯示
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Enabled = false; // 停止拍照
hd.CloseCamera();
}
private void timer1_Tick(object sender, EventArgs e)
{
hd.GrabAndDisplay(); // 定時拍照、顯示
}
定時器時間間隔設置為50ms。
9)完整代碼和運行結果如下:
Program.cs代碼:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using HalconDotNet;
namespace GrabImage
{
public partial class HDevelopExport
{
public HTuple hv_ExpDefaultWinHandle;
// Local iconic variables
HObject ho_Image = null;
// Local control variables
HTuple hv_AcqHandle, hv_Width, hv_Height;
public void InitHalcon() // 初始化Halcon
{
// Default settings used in HDevelop
HOperatorSet.SetSystem("do_low_error", "false");
}
public void InitCamera(HTuple Window) //攝像頭初始化
{
hv_ExpDefaultWinHandle = Window;
//Initialize local and output iconic variables
HOperatorSet.GenEmptyObj(out ho_Image); // 生成ho_Image數據區
HOperatorSet.CloseAllFramegrabbers();
//open camera with default settings:
HOperatorSet.OpenFramegrabber("DahengCAM", 1, 1, 0, 0, 0, 0, "default", -1, default",
-1, "default", "default", "default", -1, -1, out hv_AcqHandle);}
public void GrabAndDisplay() // 圖像抓取與顯示
{
// Grabbing images from a Daheng USB 2.0 camera
ho_Image.Dispose(); //清除yho_Image中的數據
HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle); // 採集圖像
HOperatorSet.GetImageSize(ho_Image,out hv_Width, out hv_Height);
// 獲取圖像的尺寸
HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_Height - 1, hv_Width - 1);
// 調整圖像的大小
HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle); // 顯示圖像
}
public void CloseCamera() // 關閉相機
{
HOperatorSet.CloseFramegrabber(hv_AcqHandle);
ho_Image.Dispose();
}
}
static class Program
{
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Form1.cs的代碼:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace GrabImage
{
public partial class Form1 : Form
{
HDevelopExport hd = new HDevelopExport();
public Form1()
{
InitializeComponent();
}
private void CameraOn _Click(object sender, EventArgs e)
{
hd.InitCamera(hWindowControl1.HalconWindow); //攝像頭初始化
timer1.Enabled = true; // 開始定時拍照、顯示
}
private void CameraOff _Click(object sender, EventArgs e)
{
timer1.Enabled = false; // 停止拍照
hd.CloseCamera();
}
private void timer1_Tick(object sender, EventArgs e)
{
hd.GrabAndDisplay(); // 定時拍照、顯示
}
}
}
Form設計參見圖12,程序運行結果如圖13所示。
圖13 Grab Image程序運行結果
推薦閱讀:
※如何用flask部署pytorch模型
※複雜環境下的目標視覺檢測 | 人工場景與實際場景平行研究三部曲 | 新損失函數與組歸一化
※【2D Single-person Pose Estimatiom】
※利用點雲掃描技術增強FM視覺功能
TAG:計算機視覺 |