天天看點

Halcon HSmartWindowControl之顯示圖像

概述:使用Halcon在VS中的控件顯示一張圖檔。

要點:使用了圖像縮放和圖像顯示函數,以及滑鼠滾輪響應函數。

1、建立WinForm項目

首先在VS中添加Halcon所需的控件HSmartWindowControl

然後建立新的winForm工程,并向窗體中拖入一個HSmartWindowControl控件和兩個按鈕控件。

Halcon HSmartWindowControl之顯示圖像

拖入後不添加代碼,直接運作,可能會出現如下錯誤:

HalconDotNet.HHandleBase 的類型初始化值設定項引發異常

Halcon HSmartWindowControl之顯示圖像

Halcon error #2381:License is for wrong edition of Halcon in Operator set_system

Halcon HSmartWindowControl之顯示圖像

原因是halcon運作庫是64位的,vs的運作模式也需要設定為64位,預設的debug模式可能是any CPU,需要把這裡修改成x64。

Halcon HSmartWindowControl之顯示圖像

或者從解決方案資料總管(solution Explorer)中輕按兩下打開屬性(Property)頁面,把Build欄的Platform target 改為x64即可。

Halcon HSmartWindowControl之顯示圖像

2、建立Halcon實時顯示代碼并導出

打開halcon,寫一句簡單的代碼

Halcon HSmartWindowControl之顯示圖像

接着,選擇檔案->導出,将HDevelop語言導出為C#語言。

Halcon HSmartWindowControl之顯示圖像

3、halcon 導出的C#代碼分析

實際有用的代碼就是action()内的代碼,首先聲明了圖像變量:HObject ho_Image;

需要注意的是,圖像類型需要先初始化再使用:HOperatorSet.GenEmptyObj(out ho_Image);

然後調用ReadImage函數讀入圖像檔案,最後調用Dispose函數清空對象。但是沒有顯示圖像的代碼,需要自己添加。

4、向VS中插入代碼

打開Winform工程窗體關聯的cs檔案Form1.cs,首先需要在檔案頭部添加命名空間引用:

需要在類中定義全局的視窗變量,便于操作窗體:

視窗的初始化函數中添加全局變量的初始化函數:

然後在按鈕的響應函數中添加載入圖像的及顯示的代碼:

5、圖像縮放和顯示

這裡我對導出的代碼做了修改,主要是增加了圖像縮放和顯示功能。

圖像縮放使用了ZoomImageSize函數,在幫助文檔中,這個函數有兩種用法:

上面的代碼中使用了第一種用法,所有的參數必須是Halcon的類型,但是實際使用時width 和height 可以用int類型,interpolation即內插補點算法參數也可以直接傳入string類型,如“constant”。

第二種方法需要将使用HImage類型的變量來操作,是以需要将 HObject 類型定義的圖像變量轉換一下:

圖像顯示功能:先調用SetPart函數确定要顯示圖像的區域,然後調用DispObj函數顯示圖像,DispObj也有三種用法:

此處我用的第三種:通過Hwindow調用,參數為要顯示的圖像變量。

6、SmartWindowControl視窗互動

前面實作了圖像顯示,SmartWindowControl最大的亮點其實是友善的互動功能。

可以用滑鼠拖動圖像水準移動,利用滑鼠滾輪實作圖像放大縮小。

另外,在winForm項目中,為了使用SmartWindowControl控件中圖像的縮放,還需要添加滑鼠滾輪響應的回調函數。

詳見:C:/Program Files/MVTec/HALCON-18.05-Progress/doc/html/manuals/programmers_guide/programmers_guide_0051.html

Halcon HSmartWindowControl之顯示圖像

實際測試發現幫助文檔中的用法有一些問題,消息相應函數的注冊應該在整個窗體的初始化函數中,而不是SmartWindowControl的初始化函數中。

這樣修改後,直接使用幫助文檔中提供的my_MouseWheel也有一個小bug,就是無論在窗體的任何位置滑動滾輪,圖檔都會縮放,是以需要對滑鼠的位置做一下限制: