標籤:

採用HALCON機器視覺軟體及C#語言檢測工件位置的方法 (之二)

採用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 System

5)將導出的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(); // 實例化HDevelopExport

public 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:計算機視覺 |