第一章 halcon -...

63
第一章 HALCON 恭喜諸位。 您採用了這套在產品研發,研究以及教育方面都有頂尖表現的影像分析軟體。 HALCON 可在 UNIXNT/2000/xp 等等平台下作業,它獨特的 Library 提供了千餘個為影像 分析作業,資料視覺化,除錯等等功能所設計的運算子,使用者可以利用它的功能以 C C++等程式語言自行撰寫影像處理程式。 此外,HALCON 亦支援 Windows NT/2000/XP 下的 COM 介面,所以您也可以透過 Visual Basic 使用它,使得系統的整合更為容易。 HALCON 的設計使得影像區域,邊緣,以及等值線的處理上更方便,最佳化的演算法讓這套 軟體在一般的硬體上也有很好的運算速度。 HALCON 包含了名為 HDevelop 的程式設計介面,減少了設計軟體所花的時間,還有一個好 用的線上說明,您可以查到關於 HALCON 運算子間功能相近的替代者,可能的變化,以及 交互的參考。 HALCON 6.0 版開始提供兩個版本,除了標準版外,還有支援平行運算的 parallel HALCON,可使用多 CPU 的機器,提高運算速度。 以下是 HALCON 特點的說明 1.1 HALCON 強化的 opreator library 提供有效率又有彈性的影像處理功能,簡化了影像程式 的設計 HALCON operator library 有千餘個運算子。所有的 HALCON 應用程式(像是 HDevelop HALCON C++程式)皆是利用這個 library 來工作。 這些運算子功能廣泛,包含了簡單的讀取影像,到複雜的像是 Kalman 濾波等。基本上這些 運算子各有其單一功能,而非包含了各種運算,因此一個影像分析功能是由好幾個運算子組 成的,所以其彈性遠大於由少數而複雜的運算子組成的分析程式。特化而複雜的運算子往往 只適用於某些工作甚至於影像,應用範圍狹窄。相對於這種窘境,HALCON 運算子卻能任 意組合來完成工作。 眾多的運算子中,有些是以不同的演算法來達到相同的功能,例如只需要粗略定位時,可用 fast_match 來作最快的運算,需要精確定位時,用 best_match,以較多的時間來求得最準 確結果。 1

Upload: others

Post on 12-Oct-2019

61 views

Category:

Documents


0 download

TRANSCRIPT

第一章 HALCON 恭喜諸位。 您採用了這套在產品研發,研究以及教育方面都有頂尖表現的影像分析軟體。 HALCON 可在 UNIX,NT/2000/xp 等等平台下作業,它獨特的 Library 提供了千餘個為影像

分析作業,資料視覺化,除錯等等功能所設計的運算子,使用者可以利用它的功能以 C 及

C++等程式語言自行撰寫影像處理程式。 此外,HALCON 亦支援 Windows NT/2000/XP 下的 COM 介面,所以您也可以透過 Visual Basic 使用它,使得系統的整合更為容易。 HALCON 的設計使得影像區域,邊緣,以及等值線的處理上更方便,最佳化的演算法讓這套

軟體在一般的硬體上也有很好的運算速度。 HALCON 包含了名為 HDevelop 的程式設計介面,減少了設計軟體所花的時間,還有一個好

用的線上說明,您可以查到關於 HALCON 運算子間功能相近的替代者,可能的變化,以及

交互的參考。 HALCON 從 6.0 版開始提供兩個版本,除了標準版外,還有支援平行運算的 parallel HALCON,可使用多 CPU 的機器,提高運算速度。 以下是 HALCON 特點的說明

1.1 HALCON 強化的 opreator library 提供有效率又有彈性的影像處理功能,簡化了影像程式

的設計 HALCON operator library 有千餘個運算子。所有的 HALCON 應用程式(像是 HDevelop 和

HALCON C++程式)皆是利用這個 library 來工作。 這些運算子功能廣泛,包含了簡單的讀取影像,到複雜的像是 Kalman 濾波等。基本上這些

運算子各有其單一功能,而非包含了各種運算,因此一個影像分析功能是由好幾個運算子組

成的,所以其彈性遠大於由少數而複雜的運算子組成的分析程式。特化而複雜的運算子往往

只適用於某些工作甚至於影像,應用範圍狹窄。相對於這種窘境,HALCON 運算子卻能任

意組合來完成工作。 眾多的運算子中,有些是以不同的演算法來達到相同的功能,例如只需要粗略定位時,可用

fast_match 來作最快的運算,需要精確定位時,用 best_match,以較多的時間來求得最準

確結果。

1

HALCON 可處理彩色及多頻道影像 可用於計算的影像資料,包含二值化影像,單色,彩色,或是多頻影像,在使用上並無差別。

(多頻道影像是以多鏡頭系統取得的影像資料)。 HALCON 提供了快速有效率的 region 處理計算 除了使計算更容易外,region 尺寸無限制,甚至於可以重疊,而 region 資料經過最佳的編碼

處理,在記憶體中所佔的資源極少。 HALCON 可做 ROI 的計算 每個影像中的物體都可由使用者自行定義其 region,接著再由運算子進行計算時就可以只針

對定義區域作處理,因此可以集中運算資源和速度,達到最好的效率。 HALCON 提供了快速的 pattern 匹配計算 pattern 匹配在許多應用上是很有用的,但是卻很花時間,HALCON 有許多不同的 pattern 演

算法,可以讓您自行決定何時使用。 HALCON 提供了形狀導向(shape-based)的匹配計算,使得物體有重疊或是旋轉雜置的狀況

下仍可計算。除了 pattern 匹配外,形狀導向的運算子可以在物體有縮放,照明改變,旋轉

或重疊等等情況下仍舊能辨認出物體。從 6.1 版開始,還有一個輔助工具 HMatchIt,透過簡

易的設定即可用來測試匹配執行的效率,藉由參數的調整讓您找出最佳的設定值,達到最快

的計算速度。 HALCON 提供了方便有效的 tuple 功能 tuples 是一種很有用的功能,使您處理影像,區域,參數等等資料集合時更為便利。HALCON 的 tuples 可以將相關資料整合成一個物件,使用者可以針對單一或多個 tuples 作處理,您就

不必為一個 tuple 中有多少元素要處理而煩惱,只要將指定的 tuple 丟給運算子,HALCON就會處理 tuple 中所有要計算的元素。 HALCON 在影像和資料管理上效率卓著 HALCON 有個快速有效率的記憶體管理核心,這個機制提供了資料的讀寫,還有溢位的檢

查。為了提高效率,共用的影像資料不會在記憶體中重複。 HALCON 支援 C,C++以及 COM 的程式設計 您可以在自己撰寫的 C,C++和 COM 程式中使用 HALCON 運算子,完成一個獨立的程式。 HALCON 的 HDevelop 工具幫助您發展影像分析程式 撰寫影像分析程式通常是曠日費時,為了幫助設計人員找出合適的運算子及參數,HALCON發展出一套工具程式 HDevelop。它如幫助您呢? 首先 HDevelop 有一個圖形介面,要使用

的運算子和要分析的影像一目瞭然,運算子可以自行組合,計算成果即時顯示在影像中,可

2

以幫助使用者了解不同運算子和參數對計算的影響。同時它也會提出一些運算子或參數的建

議,線上輔助除了解釋運算子如何工作外,還有範例的說明。 當您覺得計算成果滿意了,可以把設計好的成果存成 HDevelop 的專用檔案,下次可再叫用,

或者是將其輸出成 C,C++或 COM 的程式碼,可供其他程式套用,就像自行撰寫的程式一

樣。 HALCON 可連接 40 餘種影像擷取設備 目前支援的設備列表在 http://www.mvtec.com/halcon/,要連接取像設備,只要用運算子 open_framegrabber,給予格式或擷取模式等參數,再來用運算子 grab_image 即可取得影

像。 HALCON 可以讓您自行新增取像設備 如果您用的取像設備 HALCON 尚未支援,您可以利用專用介面連接。HALCON 有個開放的

介面,配合一些程式碼,就可以和 HALCON 連接,相關的說明請參考 Frame Grabber Integration Programmer's Manual。

1.2 可執行 HALCON 的作業系統 下表說明了可執行 HALCON 的作業系統

Operating System Processor Compiler

Windows NT 4.0 /2000 /XP compatible to Intel Pentium MS Visual Studio 3 Linux 2.2/2.4 compatible to Intel Pentium gcc 2.95 Solaris 7 SPARC CC 5.2 IRIX 6.5 MIPS CC Tru64 UNIX 5.1 Alpha cxx

可執行 HALCON 的作業系統一覽表 請注意,在 Linux 下需要 libc6(glibc-2.1.x),這是在大部分的 Linux 系統像是 RedHat 或 SuSe下需要的,請參考相關文件。 HALCON 也可以在 Philips TriMedia DSP 上執行,主機電腦需安裝 NT/2000/XP,這部分

請參考 HALCON/C 之 User's Manual。

3

1.3 Parallel HALCON 簡介 簡單的說,標準版的 HALCON 是在單處理器的電腦上執行單執行緒計算,在 NT/2000/XP,Linux,Solaris,HALCON 是 thread-safe,也就是可以做多緒執行,不過所有的運算子執行

時都是獨一的,所以執行緒間必須要互相等待。 相對來說,Parallel HALCON 支援平行運算,是 thread-safe 以及 reentrant,也就是不同的

執行緒可以同時呼叫同一個運算子,可使用的作業系統包含 NT/2000/XP,Linux,Solaris。 除了平行運算外,Parallel HALCON 在多處理器的系統上,會自動將運算子作平行化,舊的

HALCON 也有此功能,像是 HDevelop 這個介面,所以您開發的 C++,C,不必再做更動。 平行化的機制是將要處理的資料,例如影像,由不同的處理器上執行不同的執行緒(所謂的

data parallelism),例如一張影像的濾波運算,在一個四處理器的電腦上執行時,計算工作會

被分成四份,由四個執行緒負責,每個執行緒都是做相同的濾波計算。由於待處理的影像在

系統中不必複製,因此 HALCON 的這種設計構想可以達到最好的效率。 至於平行化或資料分配的的程度可以即時掌控,以免造成反效果,例如一張很小的影像,又

要將資料分散處理反而會浪費時間,此外,不是所有的運算子做平行化都能提高效率。 此外,parallel HALCON 是用於記憶體共用的系統中,像是典型的多 CPU 主機板,這樣不同

的執行緒才能共用一個 HALCON 資料庫,同時也不必再複製影像而造成佔用記憶體。這樣

一來有些系統是不適合執行 HALCON 的,像是 cluster 式的工作站或是一些不提供共用記憶

體的系統。 Parallel HALCON 也不提供 COM 介面,包含平行化機制和 reentrant,這是因為撰寫 COM的主要工具,Microsoft 的 Visual Basic ,尚未有效支援多緒執行之故。

4

1.4 其他資料 下列的手冊提供了各種參考資料 HDevelop User's Manual 介紹與 HALCON 核心功能連結的圖形使用者介面 HDevelop。 HALCON/C++ User's Manual 如何在您寫的 C++程式中使用 HALCON library。 HALCON/C User's Manual 如何在您寫的 C 程式中使用 HALCON library。 HALCON/COM User's Manual 如何在您寫的 COM 程式中使用 HALCON library,例如使用 Visual Basic。 Extension Package Programmer's Manual 如何自己設計一個運算子,並將其整合到 HALCON 中。 Frame Grabber Integration Programmer's Manual。 如何將一個新的取像設備加入 HALCON 的系統中。 HALCON/HDevelop,HALCON/C++,HALCON/C,HALCON/COM 所有 HALCON 運算子的參考手冊。 Application Guide 這是幾份各自獨立的文件,即所謂的 Application Note,是以工業視覺應用的觀點來寫的,

主要是說明一些計算方式的關鍵以及使用時的注意事項以及要訣等等。例如以型狀導向匹配

來尋找物體等等。 在 MVTec 的網站上所有的參考手冊都有 PDF 檔及 HTML 文件可以下載,網址為

http://www.mvtec.com/halcon

5

第二章 安裝,授權以及設定 在未說明安裝及設定方法前,先來看看不同版本及授權的相關說明 HALCON 有三種版本 1.demo 版,含 HDEvelop 以及完整的影像處理功能,但是有一些限制,例如不能連接取像

設備,也少了程式設計介面,這個版本可讓您測試 HALCON 運算子的所有功能而無時間限

制。 2.完整版,讓您可以用 HALCON 的功能發展程式。除了 HDevelop 外,還包含了所有取像功

能,C,C++,COM 之介面,還有 Extension package Interface,讓您可以整合自訂的運算

子或是新的取像設備。 3.如果您用 HALCON 的功能寫好程式,您可以得到一個 runtime version ,包含了程式中

需要的功能,這個版本就不包含 HDevelop。 使用完整版或 runtime 版,需要不同的授權碼,而 demo 版可以不使用授權碼。授權使用方

式說明如下 1. Nodelocked license 用於固定位址的電腦或機器 2. 完整版上也可以使用所謂的 floating license,在區域網路中特定位址的機器可以使用,一

個 license server 會檢查執行的 HALCON 程式數量。 至於作為 license server 的機器並非要真如一般的 server 般龐大,或是一定要是某種 server系統,像是 Windows NT server,它可以是一台 Linux 或是 Solaris 工作站,然後在其他的電

腦安裝 Windows NT/2000/XP 等以執行 HALCON,只要在 HALCON 執行時能和這個 server連接就可以了。 如果是為了估價的目的,您可以用一個免費的 temporary license。

2.1 安裝 以下說明如何由 CD 安裝 HALCON,由網路安裝的方法在網址 http://www.mvtec.com/halcon/download 有說明。名為 release_note.html 的檔案有

HALCON 的最新消息。 除了 UNIX 的系統外,檔案路徑和環境變數是以 Windows 式的寫法表示,例如

6

%HALCONROOT%\examples\extension_package\halconuser 請參考 2.4 節的說明 若是在 UNIX 系統下,寫法就變成 $HALCONROOT/examples/extension_package/halconuser 注意 如果要安裝大改版的新版 HALCON,例如 6.0 或 6.1 版等等,就必須先將舊版解除安裝,這

在 Windows 下尤其重要,因為必須要清除舊版在 registry 的紀錄。移除方法請看 2.2 節。 有個例外是 ActiveVisionTools 1.0 到 1.3 版想安裝 HALCON6.1 版,這時就要保留舊版的

HALCON 6.0.x。 如果只是小改版的更新,像是 6.0.1 升級成 6.0.2 版,有個特別的更新方法,在 2.1.3 節有說

明。 2.1.1 在 Windows NT/2000/XP 下的安裝 將 CD 置入機器,就會啟動一個安裝程式,若沒有自動執行,可在一個叫 nt-x86 的目錄下,

執行一個名為 Setup.exe 的程式,當然,您必須要有 Administrator 的權限。 首先,程式會先檢查系統資源是否足夠安裝,再來會檢查是否已安裝了 HALCON,如果已安

裝了相同的版本,程式會檢查已安裝的部分,再讓您安裝新增加的東西。若是已安裝了不同

版本的 HALCON,會問您要不要保留,至於如何在不同版本間切換,在 2.1.5 節有說明。 安裝程式同時也會檢查是否有安裝 ActiveVisionTools,還有它的版本是否和目前要安裝的

HALCON 相容。 (請參考 2.1.5 節) 這些檢查都結束後,安裝精靈會要您選擇安裝版本如下 (Compact,Custom,Typical)Full HALCON version (Runtime)runtime version (Demo)demo 版的 hdevelop_demo.exe 一些額外的東西可以日後再安裝,一樣將 CD 置入執行,再選擇您要的部分即可。 再來,如果您要用 dongle,安裝程式會問您是否安裝驅動程式,2.3.5 節有驅動程式的說明,

以及如何自行安裝而不透過 HALCON 的安裝程式。接著,程式會問您這台電腦是不是要當

成 floating license server,這樣會安裝名為 license manager daemon,來管理您的 floating license。floating license 的使用者只要在一台電腦上安裝這個程式即可當作 license server。請參考 2.3.4 節。

7

2.1.2 在 UNIX 下的安裝 您要先 mount CD,例如 /cdrom,通常您要有 root 的權限才能作這個動作,而在大部分

的系統下,CD 會被 mount 成 /etc/fstab,不能在此執行程式,所以要改成 mount /dev/cdrom /cdrom 要安裝時,啟動 CD 主目錄下的 shell script "install-unix",會問您 HALCON 要裝在哪,接著

環境變數 HALCONROOT 也要設成安裝的目錄(參考 2.4.2 節),再來會問您 HALCON 的附

加部分要裝在何處。 由於在 CD 上是唯讀的,如果您是以一般使用者來安裝,在權限改變時會出現警告訊息,而

某些系統上會出現檔名長度超過 32 字元的訊息。 接著,會檢查您的系統是否足夠安裝。安裝完成後有幾個環境變數要設定,HALCON 才能工

作。(請參考 2.4.2 節) 2.1.3 更新 HALCON 小改版的更新有一個特別的方法,例如從 6.0 或 6.0.1 更新到 6.0.2,更新方法請參

考 MVTec's 的下載區 http://www.mvtec.com/halcon/download 關於 HALCON 6.0.2 版的特別說明 從 6.0.2 版開始,HALCON 要用新的 dongle 驅動程式(來自 GLOBEtrotter),但是更新方法

中並無解除舊版的驅動程式以及新版的安裝,所以 HALCON 會出現"license not found"或類

似的錯誤訊息,因此您要用 2.3.5.1 節的方法自行將舊的驅動程式移除。 2.1.4 HALCON 系統裡的各種檔案以及目錄 以下說明了安裝目錄%HALCONROOT%下的各種子目錄以及檔案內容,不過隨著安裝選項

的不同,有些目錄不會出現。 FLEXlm 包含檢查 license 的程式 bin HALCON 的主程式,像是 HDevelop,或是 DLL 檔,frame grabber 的 libraries 等等。 doc\pdf PDF 說明文件 examples 其中的子目錄包含各類範例,例如 application_guide,配合 C,C++,delphi 之程式設計,fg_integration(影像擷取

介面),extension_package,hdevelop 之使用,MFC,VB 等等之範例。 注意,最好不要直接使用這些範例,因為在大部分的作業平台下,只有安裝者可以修改或儲

存這些範例,也不是所有使用者都可以在範例的目錄下新增儲存東西。所以最好是自行複製

一份到自己的工作目錄下。

8

images 各種工作所用的影像 include 給 C/C++程式使用的 header lib HALCON 的 libraries,包含和各種取像設備相連接的驅動程式。(在 Windows 下副檔名

為.lib,UNIX 下則為.so) license 授權資料檔要放在這裡 2.1.5 不同 HALCON 版本間的切換 您可以同時安裝不同版本的 HALCON 在同一台電腦上。在 Windows NT/2000/XP,安裝時

要修改相關的環境變數,像是%PATH%,%HALCONROOT%,%HALCONIMAGES%,以

及自設的像是%HALCONEXTENSIONS%,這部分請參考 2.4.1 節。 如果您使用 HALCON 的 COM 介面,就要對專用的 DLL 檔 halconx.dll 做 re-register。例如,

開一個 DOS shell,然後進到 bin\i586-nt4 目錄下(您的舊版 HALCON),先做 unregister,就

是在命令提示符號下鍵入 regsvr32 /u halconx.dll 然後到您的新版 HALCON 相對應的目錄下,將 halconx.dll 做 register regsvr32 halconx.dll 在 UNIX 下,要轉換不同的 HALCON 版本,則要修改相關環境變數,像是$HALCONROOT,$HALCONIMAGES,$PATH,$LD_LIBRARY_PATH 等等。 2.1.6 給 ActivVisionTools 使用者的資訊 ActiveVisionTools1.0 到 2.0 版是以 HALCON6.0 版(或 6.0.1)為基礎的,所以要是裝了

HALCON 6.1 版,將會使得 ActivVisionTools 無法使用,所以 HALCON 6.1 的安裝程式會

檢查是否在電腦上已有安裝 ActivVisionTools,如果偵測到安裝了 ActivVisionTools2.0 版,

它會提供一個新的,和 HALCON 6.1 版相容的 OCX ActivVTools.ocx。一般來說這是您該做

的選擇,您也可以事後手動修正如下,開一個 DOS shell,到您安裝 ActivVisionTools 目錄下

的 bin\i586-nt4 目錄下,對舊的 ocx 做 unregist,鍵入 regsvr32 /u ActivVTools.ocx

9

然後將其刪除,或是改名,換成新的 ocx,這在 CD 中的 misc\i586-nt4\avt20.下可以找到,

然後鍵入 regsvr32 ActivVTools.ocx 即完成更新 注意,和 ActivVisionTools2.0 不同的,1.0 到 1.3 版不能和 HALCON6.1 版一起使用(因為沒

有相容的 ocx),如果 HALCON6.1 版的安裝程式發現電腦上安裝了 ActivVisionTools,像是

1.3 版,它會警告您繼續安裝會使得現存的 ActivVisionTools 無法使用,若您還想使用,您就

得保留舊有的 HALCON6.0.x,同時用 2.1.5 節的方法來轉換版本,如果只是要評估試用新版,

建議您安裝試用版,這樣就不必再 register COM 介面的 library halconx.dll。

2.2 解除安裝 2.2.1 Windows NT/2000/XP 在 Windows 下有幾種解除安裝的方式(不過某些舊版的 HALCON 不一定適用) 1.在控制台下,選擇 新增/移除 程式。 2.若您用的是 HALCON 5.1 以後的版本,從 開始>程式集>MVTec HALCON>Uninstall HALCON 來解除安裝。 3.從 5.2 版起,安裝程式會檢查機器上是否已有安裝舊版,然後您可以利用安裝程式來解除

舊版的安裝。 這是比較好的方法,這樣可以避免路徑的變數發生問題。 以上是標準的解除安裝法,如果遇到問題,請參考 6.5.2 節。 注意,解除安裝會真的刪除安裝的檔案,不過不會刪除使用者設定的資料,也就是 registry中,像是和 HDevelop 有關的一些自定資料不會被刪除,保留在

HKEY_CURRENT_USER>Software>MVTev>Halcon 下。這裡可以自行手動刪除,不會出

問題。 解除安裝也不會移除 dongle 的驅動程式,要移除的話請參考 2.3.5 節的說明。

10

關於 6.0.2 版的特別說明 從這個版本開始需要一個新的 dongle 驅動程式,由於解除安裝不會移除舊有的驅動程式,所

以無法安裝 6.0.2 版所需的新的驅動程式,所以在用程式進行解除安裝舊版的 HALCON 前,

要先以手動移除其驅動程式,請參考 2.3.5.1 節。 2.2.2 在 UNIX 下解除安裝 只要將 HALCON 所在的安裝目錄移除即可 rm -rf $HALCONROOT 再來,移除子目錄 .hevelop,這是位在環境變數 HOME 所定義的目錄之下(參考 2.4.2 節),HDevelop 是以這個目錄來儲存視窗位置,選項資料等。 解除安裝不會刪除任何使用者自定資料,因此環境變數也不會改變,要刪除或修改時就要自

行手動處理。 如果您呼叫了Parallel HALCON 6.0 beta的 operator check_par_hw_potential來做初始化動

作,取得的資料會存在一 .halcon_par_info 檔中,置於環境變數 HOME 所指定的目錄下。

2.3 授權 HALCON 透過 FLEXlm license manager 來確認使用者的授權資料,以下說明取得授權碼

及其安裝方式。 要取得授權前,先要取得欲安裝 HALCON 電腦之辨識資料,送至代理商(新亞洲儀器公司),若使用的是 runtime license,則請告知欲安裝的模組。(請參考 2.3.2) 在您收到 license file 之後,請參考 2.3.2 節的方法來安裝。floating license 的使用者請參考

2.3.4 節來安裝。 2.3.4 取得辨識資料 取得辨識資料是由您電腦上安裝的網路卡,若您的作業系統為 NT/2000/XP,處理器為

Pentium III,則能取得所謂的 CPU ID。在 Windows NT/2000/XP 下,也可以用一個 dongle,只要有 dongle,就可以在其他電腦上執行,這樣就不必限定在某台電腦上使用,而且適用於

nodelocked 或是 floating license 之使用者。詳細說明請參考 2.3.5 節。 2.3.1.1 用 HDevelop 取得辨識資料 用 demo 版的 HDevelop 來取得辨識資料是最簡單的方法。在主選單 Help>About,會出現如

下的一個視窗,最底下的資料就是關於您這部電腦的資料,像是網路卡卡號,CPU ID,dongle號碼等。

11

如果發生問題,既有的設備資料找不到,例如有網路卡而偵測不到,請參考 6.5.3 來排除問

題。 2.3.1.2 用 lmhostid 來取得資料 lmhostid 是隨著 FLEXlm 的軟體,在 Windows 作業系統下,由 DOS 下執行,在 UNIX 系統

中,則要切換目錄,到$HALCONROOT/FLEXlm 下,再到對應您的硬體設備的目錄下(例如

i586-Linux2.2)執行之。 要辨認一台電腦的網路卡號,鍵入 lmhostid -ether Windows 系統下的輸出畫面例子如下 > lmhostid -ether lmhostid - Copyright (C) 1989-2000 Globetrotter Software, Inc. The FLEXlm host ID of this machine is "00e02958e36a" 請將 ID,就是上面例中的"00e02958e36a"以及電腦的 hostname 一起送給代理商。 如果 lmhostid 回傳”ffffffff”,請依照 6.5.3.1 節的方法來處理。 要辨認 CPU ID,鍵入 lmhostid –cpu64 > lmhostid -cpu64 lmhostid - Copyright (C) 1989-2000 Globetrotter Software, Inc. The FLEXlm host ID of this machine is "0003-C1DE-01C3-E79F" 如果 lmhostid 回傳"",則可能是因為在 BIOS 中 CPU ID 的選項關了,可在重新開機時將其

開啟。

12

要檢查 dongle ID(限於 Windows NT/2000/XP),則鍵入 lmhostid -flexid 會得到如下例之輸出 > lmhostid -flexid lmhostid - Copyright (C) 1989-2000 Globetrotter Software, Inc. The FLEXlm host ID of this machine is "FLEXID=7-36c79bd7"

注意,此時序號會寫入 dongle 中 2.3.2 Runtime license 和 HALCON 的模組 HALCON 之運算子可分類成不同的模組,像是 "Basic operators",或是"Image/Region/XLD management",用於所有 HALCON 之功能,特別的像是"Background Estimation","1D Bar Code Reader"之類的,只用於特定的程式。使用 runtime 版時可以只包含您需要的模組。 您的程式中用到了那些模組,有兩種方式來檢查。 在 HDevelop 下執行的程式,可由選單下,File>Moduals,然後會出現一個如下圖的視窗,

其中就有使用到的模組名稱,然後按"Save",即可將這些紀錄存成 .mod 檔,放在目前的工

作目錄下。 由 C,C++,COM 所寫成的應用程式,則需在程式結尾加入運算子 get_moduals。 然後將確定需要的模組名稱送到代理商。

圖例 您使用到的模組

13

2.3.3 安裝 license file 要使用 HALCON 就要安裝 license file,這個檔案必須放在%HALCONROOT%\license 下,

檔名需為 license.dat,如果是用 floatong license,您必須將這個檔案複製到所有已安裝

HALCON 的電腦上,包括作為 license verver 的電腦。 以下例子是一個 nodelocked license file 的內容。 ############################ # MVTec (ID: 0080c77161e2) # ############################ FEATURE MVTec_Halcon mvtecd 6.1 permanent 0 FC17B37961F326F957A8 \ VENDOR_STRING=65535 HOSTID=0080c77161e2 ck=23 FEATURE MVTec_HDevelop mvtecd 6.1 permanent 0 CC279389F3566E1D6363 \ VENDOR_STRING=65535 HOSTID=0080c77161e2 ck=32

圖例 nodelocked license,限用於某台電腦 您可以看到,檔案中"FEATURE"接著 HALCON 的版本名稱,而 license 是向下相容的,舉

例來說,6.1 版的 license 亦可以用於 6.0 版。同時,向上亦可用於小改版的升級,例如 6.1版的 license 可用於 6.1.x 版。 ################################# # MVTec (ID: FLEXID=7-b285ff7f) # ################################# FEATURE MVTec_Halcon mvtecd 6.1 permanent 0 3C574319AF86C4A5DE4A \ VENDOR_STRING=65535 HOSTID=FLEXID=7-b285ff7f ck=35 FEATURE MVTec_HDevelop mvtecd 6.1 permanent 0 7C772379E2D066930D10 \ VENDOR_STRING=65535 HOSTID=FLEXID=7-b285ff7f ck=245

圖例 nodelocked development license ,限用於特定 dongle ################################# # MVTec (ID: FLEXID=7-b285ff7f) # ################################# FEATURE MVTec_Halcon mvtecd 6.1 permanent 0 3C574319AF86C4A5DE4A \ VENDOR_STRING=65535 HOSTID=FLEXID=7-b285ff7f ck=35

圖例 nodelocked runtime license,限用於特定 dongle

14

2.3.4 floating license 之使用 在之前的介紹中已有概略的介紹,首先,要有一台電腦當成 license verver,安裝一個名為

license manager daemon 的程式來檢查網路中執行 HALCON 之電腦之數目,再來,license file 要 copy 到所有安裝 HALCON 之電腦,而且也要 copy 到作為 license verver 的電腦上(參考 2.3.4.3)。 接著來看看一個典型的 floating license。"SERVER"告訴 FLEXlm 當作 license server 電腦的

名稱,這個例子裡,就是 halconserver。還有網路卡號,以及 port number(27000)。 ############################ # MVTec (ID: 0080c77161e2) # ############################ SERVER halconserver 0080c77161e2 27000 DAEMON mvtecd C:\Progra~1\MVTec\Halcon\FLEXlm\i586-nt4\mvtecd FEATURE MVTec_Halcon mvtecd 6.1 permanent 2 4C72DB2EC0F315624FAE \ VENDOR_STRING=16383 ck=97

圖例 floating runtime license 的內容(限用於某台電腦) 某些情況下您可會想改變電腦的 hostname,例如您用的是 dongle-bound license,基於某些

需要想把 dongle 換到網路中另一台電腦上,或是您用限用於某網路卡的 license,而您想把

網路卡移到另一台電腦上。 您也可能會需要更改使用的 port,例如預設的 port 已被網路中某軟體佔用,但是要注意的,

大部分的電腦中,port number 小於1024的,只有特定權限的使用者能更改。 當您在網路中任一台電腦執行 HALCON 時,license file 中的"SERVER"後接著的資料,諸如

host name 和 port number 等等,是用於讓程式尋找聯繫 license server,而在作為 license server 的電腦上,port name 是作為啟動 license manager daemon 的依據,所以在電腦中,

所有複製的檔案內容必須相同。 在您做為 license server 的電腦上,可能會需要修改 daemon 的目錄 mvtecd,這目錄通常如

下 %HALCONROOT%\FLEXlm\%ARCHITECTURE%\mvtecd (關於環境變數 ARCHITECTURE 請看 2.4 節) 由於 license file 中沒有環境變數資料,所以這個目錄要自己新增。由於目錄字串中含有空白

字元時會造成 HALCON 的問題,所以當您將 HALCON 裝在像是 c:\program Files\MVTec\Halcon 下時,路徑字串應改為 c:\progra~1\MVTec\Halcon。 最後一點,license manager daemon 必須在開機時啟動。 2.3.4.1 在 Windows NT/2000/XP 下安裝 license manager daemon 在 Windows 下,可以由安裝程式來安裝,然後他就會在重新開機以後自動啟動,當然您也

可以自行手動安裝,這要在 DOS 下鍵入(這是一整串指令)

15

"%HALCONROOT%\FLEXlm\i586-nt4\installs" -n "HALCON Licenses" -c "%HALCONROOT%\license\license.dat" -l "%HALCONROOT%\license\license.log" -e "%HALCONROOT%\FLEXlm\i586-nt4\lmgrd.exe"

%HALCONROOT%即是安裝的目錄,在 Windows 下,安裝好後必須重開機。如果安裝成功,

一個稱為 HALCON 的 service 會出現在控制台下的系統管理工具的"服務"中出現。 要移除 liscense manager daemon,鍵入如下之指令 "%HALCONROOT%\FLEXlm\i58-nt4\installs" -r -n "HALCON Licenses" 2.3.4.2 在 UNIX 下安裝 license manager daemon 在 UNIX 下,這個程式 lmgrd 必須放在適當的啟動檔中,像是/etc/init.d/boot.local 或/sbin/init.d/boot.local,諸如此類。這部分請參考您使用的作業系統手冊。 在這個檔案中加入下面一整行(要有 lmgrd 的目錄) /etc/lmgrd -c $HALCONROOT/license/license.dat > $HALCONROOT/license/license.log 2>&1 & 注意,lmgrd 要由 root 啟動,否則不能正常的作業。 2.3.4.3 重新啟動 license manager daemon 如果您換了一個 floating license,就要將 daemon 重新啟動。方法之一是重新啟動電腦,如

果您有管理者的權限,也可以用手動方式新啟動。在 Windiows 下,您只要在系統管理工具

下的"服務"中,將"HALCON License"這個服務重新啟動即可。 在 UNIX 下,您可以終止 lmgrd 這個 process,然後再重新啟動,啟動的指令就是 2.3.4.2 節

中,加入啟動檔的那一行。 2.3.5 使用 dongle dongle 只有在 windows 下才能使用,從 6.0.2 版起,還提供了連接 USB 的 dongle。連接印

表機埠的 dongle,其 ID 是以"FLEXID=6-"或"FLEXID=7-"開始,而 USB dongle 的 ID 是以

"FLEXID=9-"起。

16

2.3.5.1 連接平行埠的 dongle 就像 2.1.1 節所敘述的,您可以讓 HALCON 安裝驅動程式,要檢查安裝是否成功,可由裝置

管理員來檢視是否有一個叫 sentinel 的設備。 HALCON 也有一個輔助程式讓您可以自行安裝,設定,或是移除驅動程式。進到 DOS 下,

切換到%HALCONROOT%\FLEXlm\i568-nt4\flexid6-7\win_nt 目錄下,執行 setupx86.exe。要安裝驅動程式,在主選單下選 Functions>install,然後重新啟動電腦。然後用上述的檢查

方法應該可以看到該項設備。要注意的是,您必須要有 Administrator 的權限才能安裝驅動程

式。如果您沒有權限,程式會也安裝,並告訴您安裝完成,而實際上無法作用。 要是電腦上有多個 parallel port,則還要再調整驅動程式。 HALCON 的解除安裝程序並不會移除這個驅動程式(因為其他程式有可能用到),但是卻會把

這個安裝程式移除,所以如果您要移除這個 dongle 驅動程式,就要在您將 HALCON 解除安

裝之前完成。這個安裝程式是在 CD 的 FLEXlm\i586-nt4\flexid6-7\win_nt,有需要時可再叫

用。 關於 6.0.2 版的特別消息 如同在 2.1.3 以及 2.2.1 節所敘述的注意事項,為避免出問題,建議以如下之程序進行安裝。 手動方式解除舊的驅動程式。 用到的程式是 setupx86.exe,位於%HALCONROOT%\FLEXlm\i586-nt4\dongle 下。 再來就有兩個方式可以安裝 HALCON 6.0.2。 用 2.2.1 節的方法來移除舊版的 HALCON,然後將 6.0.2 版和新的驅動程式一起安裝。 用 2.1.3 節的更新方法,也就是手動更新,用到的程式 setupx86.exe 位在

%HALCONROOT%\FLEXlm\i568-nt4\flexid6-7\win_nt 下。 如果您在移除舊版的驅動程式前先移除了舊版的 HALCON,這個 setupx86.exe 也會被刪除,

但是它是位在 CD 中 FLEXlm\i586-nt4\dongle 下,若您沒有 CD,建議您重新安裝舊版的

HALCON。 2.3.5.2 USB dongle 如同 2.1.1 節,所需要的驅動程式可在 HALCON 安裝時一起安裝,安裝是否成功,可由裝置

管理員中查看是否有新增以下兩項裝置 Hardlock 以及 HASP。 隨者作業系統的不同,您也可以用一個 HALCON 隨附的輔助程式來修改,設定,移除驅動

程式。切換到 DOS 下,切換到目錄%HALCONROOT%\FLEXlm\i586-nt4\flexid9,有個程式 hinstall.exe ,有下列指令可供顯示,安裝,移除等等。

17

hinstall 顯示如何使用 hinstall hinstall -info 顯使驅動程式的狀態 hinstall -install 安裝驅動程式 hinstall -remove 移除驅動程式 當然,必須要有 Administrator 的權限才能安裝。 由於 HALCON 的解除安裝程式不會移除 dongle 的驅動程式,但是會將安裝程式 hinstall.exe移除,所以若是要移除這個驅動程式,就要在解除安裝 HALCON 前進行。原始的程式在 CD中的位置位於 FLEXlm\i586-nt4\flexid9。

2.4 設定 HALCON 需要設定的東西大部分都是環境變數,例如放置影像,放置 extension package 的

目錄等等。要使用 Parallel HALCON 時,每一台分擔計算的電腦上都要做初始化(initialize),這部分會在 5.1.1 說明。 2.4.1 Windows NT/2000/XP 下的設定。 安裝程式 Setup.exe 執行時會自動設定這些環境變數,像是%HALCONROOT%等,要查看

變數的內容,可用控制台下的"系統"中查看,或是修改,新增變數內容。若是變數內容含有

不只一個項目,例如%PATH%可能含有數個目錄,此時各個目錄間就要以分號";"區隔之。

此外,要在安裝時同時修改建立這些變數,必須要有 Administrator 的權限。 HALCONROOT 這是最重要的環境變數,指出了 HALCON 安裝的目錄。典型的變數內容內容像是 C:\Program Files\MVTec\Halcon。根據這個變數,HALCON 得以到以下的子目錄中尋找資

料。 %HALCONROOT%\help 運算子的資料庫位於此處。由 HALCON 來存取有關運算子的資料。 %HALCONROOT%\doc\html\reference\hdevelop 線上輔助說明,只要有一個瀏覽器就可以閱讀其內容。

18

%HALCONROOT%\lut 使用者自訂之 look-up table。 %HALCONROOT%\ocr 存放了 trained fonts。 %HALCONROOT%\license license KEY 置於此,也就是 license.dat 檔。 %HALCONROOT%\images 系統中沒有 HALCONIMAGES 這個變數時,HALCON 會到這個目錄找尋影像。 HALCONIMAGES 這是告訴系統影像資料存放的地方,其中可以包含數個目錄,但是要記得用分號區隔之。 ARCHITECTURE HALCON 用這個變數來區別作業系統,在 Windows 下,%ARCHITECTURE%即是設成

i586-nt4。 這個變數同時會在好幾個地方出現,像是 HALCON 的程式,hdevelop.exe,halcon.dll 等等,

是置於%HALCONROOT%\bin\i586-nt4 下,要 link 程式用的 library 像是 halcon.lib,位在

%HALCONROOT%\lib\i586-nt4 下。 HALCONEXTENSIONS 這個變數含的目錄,是使用者自訂的運算子所在位置(所謂的 extension packages),每個

package 中含有數個運算子,linked 到一個共用的 library。還有一些說明文件,像是運算子

的 help,以及 HTML 檔。安裝 extension package 請看 2.5 節的安裝方法。 HALCONSPY 如果在啟動 HALCON 前,系統中已有 HALCONSPY 這個變數,那麼在 HALCON 啟動時,

一個工具程式 HALCON Spy 也會啟動。由運算子 set_spy 也可以將其啟動(參數為"mode","on"),兩種啟動方法的差異在於,有了 %HALCONSPY%這個變數,就可以監看一個 linked 好的 HALCON 程式,而不必再去修改。

相關設定請參考 6.4 節。 PATH 安裝時,%HALCONROOT%\bin\i586-nt4 和%HALCONROOT%\FLEXlm\i586-nt4 會被加到

PATH 中。

19

2.4.2 UNIX 下的設定 在 UNIX 下,不同的 shells 設定環境變數的指令各不相同,例如 setenv <variable><value>,export <variable>=<value>,這部分請參考您的作業系統說明。如果變數內容不只一個項目,

請用冒號區隔。 下表列出了 HALCON library 和 HDevelop 要用到的環境變數列表。最好把這些指令加在一

個 login script 或是 shell resource script 中,例如.cshrc 或是.profile 裡。 HALCONROOT 這是最重要的環境變數,指出了 HALCON 安裝的目錄。典型的變數內容內容像是

/usr/local/halcon 或/usr/halcon。根據這個變數,HALCON 得以到以下的子目錄中尋找資料。 $HALCONROOT\help 運算子的資料庫位於此處。由 HALCON 來存取有關運算子的資料。 $HALCONROOT\doc\html\reference\hdevelop 線上輔助說明,只要有一個瀏覽器就可以閱讀其內容。 $HALCONROOT\lut 使用者自訂之 look-up table。 $HALCONROOT\ocr 存放了 trained fonts。 $HALCONROOT\license license KEY 置於此,也就是 license.dat 檔。 $HALCONROOT\images 系統中沒有 HALCONIMAGES 這個變數時,HALCON 會到這個目錄找尋影像。 HALCONIMAGES 這是告訴系統影像資料存放的地方,其中可以包含數個目錄,但是要記得 UNIX 下要用冒號

區隔之。 ARCHITECTURE 這個變數以一個簡寫表示了所用的處理器以及作業系統版本。例如 i586-linux2.2,或是

sparc-sun-solaris7。ARCHITECTURE 會出現在好幾個地方,像是程式 hdevelop 位在

$HALCONROOT/bin/$ARCHITECTURE。把$HALCONROOT/bin/$ARCHITECTURE 加到

20

PATH 變數中,在使用 shell script 時很好用。Shared library 位於

$HALCONROOT/lib/$ARCHITECTURE 下。下表為目前支援的作業平台以及對應的

ARCHITECTURE 內容。

ARCHITECTURE Operating System (Platform) i586-linux2.2 Linux 2.2/2.4 on Intel Pentium (or compatible)

sparc-sun-solaris7 Solaris 7 on Sparc Workstations mips-sgi-irix6.5 IRIX 6.5 on SGI Workstations (Mips processors)

alpha-compaq-osf5.1 Tru64 UNIX 5.1 5 on Alpha processors PATH 如果想要在任一個目錄都可以啟動 HDevelop,就必須將 HALCON 的目錄

$HALCONROOT/bin/$ARCHITECTURE 加進環境變數 PATH 中。 LD_LIBRARY_PATH 請將 HALCON library 的目錄$HALCONROOT/lib/$ARCHITECTURE 加到

LD_LIBRARY_PATH 這個環境變數之中。 設好以後,HDevelop 和開發的獨立的程式才能使用。 HALCONEXTENSIONS 包含一些使用者自訂的運算子(所謂的 package)所在的目錄,每個 package 中含有數個運算

子,linked 到一個共用的 library。還有一些說明文件,像是運算子的 help,以及 HTML 檔。

安裝 extension package 請看 2.5 節的安裝方法。詳細方法請參考 Extension package Programmer's Manual。 HALCONSPY 如果在啟動 HALCON 前,系統中已有 HALCONSPY 這個變數,那麼在 HALCON 啟動時,

一個工具程式 HALCON Spy 也會啟動。由運算子 set_spy 也可以將其啟動(參數為"mode","on"),兩種啟動方法的差異在於,有了$HALCONSPY 這個變數,就可以監看一個 linked 好

的 HALCON 程式,而不必再去修改。相關設定請參考 6.4 節 DISPLAY 系統以這個變數來顯示視窗,和其他的 X 視窗程式一樣。 HOME 在 Parallel HALCON 6.0 beta 中,做初始化的運算子 check_par_hw_potential 會將取得的

主機資料存於 $HOME.halcon_par_info。

21

2.5 整合 HALCON Extension Package HALCON 的 Extension Package Interface 可以讓您將自行開發的計算法和 HALCON 整合

在一起,成為所謂的 extension packages。目前可以使用的 package 項目可由 HDevelop 之

選單 Help>HALCON News(WWW),連結到 MVTec 的網站來取得資料。 2.5.1 安裝 Extension package 先將這些 package 移到%HALCONROT%目錄下,解壓縮,再來,將完整的目錄

%HALCONROOT%\packages\halconuser 加到環境變數 HALCONEXTENSONS 中。 注意,package 的名稱,以及其中所含的 library 或 Dll 檔的名稱都不可以更改。否則會無法

用使用。 如果 package 中含有影像,例如說含有一些範例影像您要使用,可以將其影像所在的目錄加

入環境變數之中(HALCONIMAGES),要使用這些影像時就不必再輸入完整的路徑。 2.5.2 在 HDevelop 中使用 Extension Package 在 HDevelop 下要使用新的 package 時,只要將程式重新啟動,就會自動整合位於

HALCONEXTENSIONS 所載目錄中的 packages。各種新增的運算子在使用上和 HALCON原有者並無二致。 在 Linux 下,必須在您啟動 HDevelop 前,將 package library 所在的子目錄 lib/i586-linux2.2加入環境變數 LD_LIBRARY_PATH 中。 2.5.3 在一個獨立的程式中使用 Extension Package 您必須在程式碼中將這些 package library(像是 Windows 下的 Dll,UNIX 下的 shared library)link 進來。 2.5.3.1 在 Windows NT/2000/XP 中使用 Extension Package 如果要用 C 或 C++寫新的程式,要將 packagec.lib 或 packagecpp.lib 連到您的 obj 檔,當然

基本的 library,像是 halconc.lib 或是 halconcpp.lib 也要 link 進來。 要能 link 這些 Dll,系統的環境變數 PATH 就要含有完整的路徑像是 %HALCONROOT%\packages\halconuser\bin\i586-nt4 此外,不要把這些 Dll 檔複製到 Windows 的系統目錄下,否則執行時會被重複載入。

22

2.5.3.2 在 Linux 中使用 Extension Package 如果要用 C 或 C++寫新的程式,要將 libpackage.so 或 libpackagec.so 或 libpackagecpp.so等檔案 link 起來,當然基本的 library,像是 libhalcon.so 或是 libhalconc.so,libhalconcpp.so等等也要 link 進來。 要能使用這些 LIBRARY,系統的環境變數 LD_LIBRARY_PATH 就要含有完整的路徑像是 lib/i586-Linux2.2 2.5.3.3 在 Solaris 中使用 Extension Package 如果要用 C 或 C++寫新的程式,要將 libpackage.so 或 libpackagec.so 或 libpackagecpp.so等檔案 link 起來,當然基本的 library,像是 libhalcon.so 或是 libhalconc.so,libhalconcpp.so等等也要 link 進來。 要能使用這些 LIBRARY,系統的環境變數 LD_LIBRARY_PATH 就要含有完整的路徑像是 lib/sparc-sun-solaris7 2.5.3.4 在 IRIX 中使用 Extension Package 如果要用 C 或 C++寫新的程式,要將 libpackage.so 或 libpackagec.so 等檔案 link 起來,當

然基本的 library,像是 libhalcon.so 或是 libhalconc.so,libhalconcpp.so 等等也要 link 進來。 要能使用這些 LIBRARY,系統的環境變數 LD_LIBRARY_PATH 就要含有完整的路徑像是 lib/mips-sgi-irix6.5 2.5.3.5 在 Tru64 UNIX(DIGITAL UNIX)中使用 Extension Package 如果要用 C 或 C++寫新的程式,要將 libpackage.so 或 libpackagec.so 等檔案 link 起來,當

然基本的 library,像是 libhalcon.so 或是 libhalconc.so,libhalconcpp.so 等等也要 link 進來。 要能使用這些 LIBRARY,系統的環境變數 LD_LIBRARY_PATH 就要含有完整的路徑像是 lib/alpha-compaq-osf5.1

23

第三章 對 HDevelop 的初步認識 本章是入門使用者必須熟悉的章節,將介紹如何從頭開始處理一個影像分析問題,在範例中

會介紹 HDevelop 重要的功能,讓您逐漸習慣它的使用介面以及掌握有效的使用方法。 這個範例是屬於品管領域的,目的是檢查工件上的 bonding balls,範例位於 HALCON

package 的子目錄下 %HALCONROOT%\examples\hdevelop\Manuals\GettingStarted\example.dev 範例中會介紹 如何用 HALCON operator 建立一個 HDevelop 程式。 如何找到合適的 operator 以及其參數。 如何使用圖像及控制變數。 如何使用圖形視窗。 如何產生 ROI。 如何利用型態學的方法來解決範例中的問題。 如何使用 pattern 匹配。 如何使用 control struct。 仔細的讀完這一章,您會熟悉 HDevelop 的各種互動式介面,讓您能夠自行開發自己專用的

影像分析程式。

圖例 要分析的影像:工件上的 bonding balls

24

3.1 HDevelop 的使用者圖形介面 GUI。 在 Windows 下,由"開始">程式集>MVTec HALCON>HDevelop 啟動,在 UNIX 下則是由

shell 中啟動 hdevelop。程式啟動後可以看到一個主畫面,其中包含了四個視窗,Program,

運算子,變數,影像等。以下是簡單的介紹,至於詳細的內容請參考 HDevelop User's Manual。 3.1.1 主畫面 如下圖所示,它整合了程式發展以及作業管理功能(像是 loading,saving),選單以及工具列。

圖例 主畫面 主選單 主選單中包含了所有 HDevelop 的功能,如下表所列。

25

File 載入以及儲存 HDevelop 的程式,或是結束 HDevelop 之作業。 Edit 編輯 HDevelop 的程式。 Excute 執行 HDevelop 的程式。 Visualization 自訂影像視窗外觀。 operators 子目錄中含有程式結構,HDevelop 之運算子,以及所有的 HALCON 運算子。 Suggestions 提供選用運算子的建議。 Windows 各個視窗的管理(重疊,排列,切換等) Help 開啟說明檔。 工具列 工具列含有一系列常用功能的捷徑,同時掌控了 HDevelop 程式的執行。 New 刪除 program windows 中目前的程式。 Open 開一個新的 HDevelop 程式。 Save 儲存 HDevelop 程式。 Cut 刪除程式中選起來的程式碼。 Copy 複製程式中選起來的程式碼。 paste 貼上程式中選起來的程式碼。 Run 執行 HDevelop 程式。 Step 執行 HDevelop 中下一個程式指令。 Stop 終止程式的執行。 Avtivate 使程式中選取的部分指令可被執行。 Deactivate 使程式中選取的部分指令被忽略。 Reset 重新啟動程式並重設所有變數。 set parameters 顯示 visualization 參數的視窗。 Pixel info 顯示 pixel info 視窗。 Zooming 顯示即時縮放視窗。 gray histogram info 顯示頻譜資料。 Region info 顯示 ROI 中的各種資料。

26

3.1.2 program 視窗 這個視窗是用來顯示一個 HDevelop program。它可以顯示整個程式或是某個運算子。視窗

左側是一些控制程式執行的指示符號。HDevelop 剛啟動時,可以看到一個綠色箭頭的

program counter(簡稱 PC),一個插入符號,還可以設一個中斷點(breaking point),視窗右

側顯示程式碼。 3.1.3 運算子視窗 您所選擇的運算子的重要資料會顯示在這裡。包含了所有的參數,各個變數的型態,以及參

數數值。這裡會顯示參數的預設值,以及您可以選用的數值。每一個運算子都有線上說明。 另一個常用的的是變數名稱的查詢顯示功能,在一個 combo box 裡,只要鍵入部分字串甚

至開頭的字母,即可顯示所有符合名稱的運算子供選用。 3.1.4 變數視窗 這個視窗顯示了程式在執行時產生的各種變數。在變數上用滑鼠雙擊之,即可顯示變數值。

如果變數值包含了影像資料或 ROI,所謂的圖像化變數,會顯示在圖形視窗裡。 3.1.5 圖形視窗 用來顯示圖像化變數資料,視覺化的方式可以依據您的需要來調整,相關功能位於

Visualization 選單下。您可以開啟數個 graphic 視窗,並且自行選用要用的視窗。 3.2 編輯 HDevelop 程式 HDevelop 啟動以後,就可以開始從 program 視窗輸入,逐步建立您自己的 HDevelop 程式。

要在程式中新增一行,像是加一個運算子,有兩個步驟。 首先要將游標放在您要新增的地方,用鍵盤的 Shift 鍵加上的滑鼠左鍵,點在您要加入的地方

(插入符號位於視窗左側)。 接下來從 Operator 選單中選擇,或是由運算子視窗來選用想要加入的資料。 新的(選好的)運算子會出現在 運算子 視窗中,包含它的參數等等資料,此時按下 Enter,就

會將它加入程式碼中,成為新增的一行。如果您按的是 OK,除了程式碼會新增以外,同時

也會執行程式。如果您按的是 Apply,運算子不會新增到程式中,但是會被執行,這樣就可

以方便又有效的測試修改參數的結果。 如果只要執行某一行,可以將 PC(Program counter)置於要執行的那行前,再用滑鼠左鍵在

該行前按一下,然後按 HDevelop 工具列的 Step。如果您按了 Run,接下來的程式碼都會執

27

行,直到一個中斷點或是按 Stop 將其中止。在程式碼中點一下,就是選擇了這一行,按兩下,

會將該行資料顯示在 運算子 視窗中。 程式完成後,可以將其儲存供日後叫用,或是輸出成 C,C++,COM 的程式碼,產生一個獨

立的程式,在選單中 File>Save as 即可儲存。 以上敘述的這些基本操作在範例程式中會經常用到,您將有許多機會熟悉這些操作,接下來

將敘述如何載入影像。

3.3 載入影像 開始作業時,必須新增一個 HALCON object 來放置您的影像。取得影像的方法有數種。 利用取像設備取得即時的影像(由選單 Operators>Image>FrameGrabber)。 由現存影像檔讀取(由選單 File>Image 以及 File>Read Image)。 自行產生一個新影像(由選單 Operators>Image>Creation)。

圖例 設定運算子 read_image 之參數 上例中用到 運算子 read_image,可以從主選單 Operators>File>Images 選擇,或是在運

算子 window 中的"Operator"文字輸入欄手動鍵入,再按 Enter。此時這個運算子應該會如上

圖般出現,第一個欄位是要新增的 image object 名稱,現在自行把它改成"Die",用滑鼠左鍵

28

在欄位中按一下,就可以輸入。第二個欄位是影像檔檔名,將其改成"Die3" read_image(Die,"Die3") 這個運算子有兩個參數,都指定好以後按 OK,系統就會將其加進 program window 中並且

執行,到此您已完成第一行程式。變數 "Die",包含了一個 image object,會顯示在變數視

窗中,同時在這個例子裡,運算子的運算結果會顯示在圖形視窗中。如果載入影像時發生錯

誤,請檢查環境變數是否設對。如果系統中環境變數 HALCONIMAGES 沒設,影像資料就

要放在%HALCONROOT%\images 指定的目錄下。

3.4 修改圖形視窗 由於預設的圖形視窗尺寸為512*512,因此您的影像尺寸不同時,顯示在螢幕上就會

變形,雖然可以用滑鼠拉動視窗四周來調整尺寸,但是要看到無變形的影像,最快的方法是

由選單 Visualization>Size Window>Original,即可自動調整視窗。由於以後的例子中要用到

window 的 ID,所以現在要用 HDevelop 的運算子來新增一個圖形視窗,其中參數 Width 和

Height 是視窗的大小,如果不知道確實的尺寸,就給他"-1",即是最新開啟的影像大小。 dev_open_window(0,0,-1,-1,black,WindowID), 按下 OK,就會產生一個新的圖形視窗,同時尺寸和您的影像相符。不過這個視窗目前是黑

的,現在它已是"Active",您輸入的資料就會顯示在上面。此時,在變數視窗中雙擊圖像變數

"Die",就會顯示影像。 預設的影像檢視方式是顯示像素的陣列,當然也可以用其他方式來觀察,例如從

Visualiation>Set Parameters>Paint ,選 3D-plot,再來按 Update,就可以看到以 3D 顯示

的 image。其他各種顯示方式在 HDevelop Users Manual 有詳細說明。在這個範例中,別忘

記將顯示方式轉回預設方式。所有的顯示模式都可以由程式控制切換,例如顯示頻譜可由 dev_set_paint('3D-plot')行之。 您也可以縮放影像。由選單中 Visualization>Set Parameter,選 zoom 項,按上面的

"Interactive"鍵,就可以用滑鼠選擇要放大的區域,用滑鼠左鍵按住拉動,從放大區的左上角

到右下角,放開,然後按右鍵。要回覆原有尺寸,在剛才的畫面中按"Reset"鍵即可。

29

3.5 產生 ROI 在待處理的影像中指定一個 ROI 是非常有用的,由於只要計算指定區域內的影像,因此可以

大幅提昇效率。

圖例 矩形和任意形狀的 ROI

產生 ROI 有幾種方式 矩形的 ROI 由選單中 Operators>Graphics>Drawing 選擇 draw_rectangle1 這個運算子,不要修改任何

參數,執行之,在程式視窗中就會新增一行,然後 HDevelop 就會等您把區域畫上去,畫的

方法和 zoom 的方法相同。畫好之後變數視窗中會出現四個變數,Row1,Column1,Row2,Column2,請看下圖,接著要產生 ROI 做為 HALCON 的 object,由選單中

Operator>Regions>Creation 選用 運算子 gen_rectangle1,此時使用的參數就是從 Row1到 Column2 等等,輸出物件的名稱可以自訂為"ROI"。 兩個運算子使用的參數 draw_rectangle1 (WindowID, Row1, Column1, Row2, Column2) gen_rectangle1 (ROI, Row1, Column1, Row2, Column2) 執行這個運算子,您就產生了另一個 HALCON object,也就是 region(請看 4.2.3 節)。

30

圖例 變數視窗 預設的 region 表示法就是用特定顏色在圖形視窗中畫出 region 的形狀。您也可以自行修改

輸出方式,像是顏色,線條粗細等等。從選單 Visualization 或是用 dev_*.等運算子來作業,

例如由 Visualization>Color 來選顏色,Visualization>Line>Width 來改變線寬,

Visualization>Draw 來指定畫區域外圍或是填滿顏色。改變圖形輸出方法以後圖形視窗都會

更新,要顯示變數視窗中某個圖像化變數,在上面點兩下即可。 任意形狀的 ROI HALCON 可使用任意形狀做為 ROI 區域。用選單 Operators>Graphics>Drawing 之

Draw_region,而不是用之前的畫矩型的方法。 draw_region(ROI,windowID) 為了要讓程式正確運作,請把其中 draw_rectangle1(在程式視窗中按一下這一行就可以選

取)用 Edit>Deactivate 使其不執行,同樣的,gen_rectangle1 也讓它不執行。 計算適合的 ROI 用計算來找出 ROI 是利用影像分析的中間結果,這是最有挑戰性,變化彈性最大的部分。在

3.8 節的例子中會介紹如何找出工件上的球型物。

31

當您產生一個 ROI 以後,可以用 reduce_domain,(Operators>Image>Domain),將影像約

化。其中 Die 為輸入之影像,ROI 為輸入之 region。 reduce_domain(Die,ROI,ImageReduced) mean_image(ImageReduced,ImageMean,11,11)_ 本例中輸出影像名為 ImageReduced,只包含了 ROI 的部分,按 Clear 鍵清除畫面,然後在

變數視窗中雙擊 ImageReduced 這個變數就可以看到約化的效果,此時您可以用一些運算子

對原始影像和 reduced 影像做運算,觀察在效率上的差異。例如用

Operators>Filter>Smoothing 中的 mean_image,數入影像用原始影像"Die"。然後再按

一下 Clear 鍵清除畫面,在程式碼 mean_image 這行上按兩下,就可以輸入參數,在這裡把

輸入的影像改為 ImageReduced。 要重複上列方式來觀察不同 ROI 的差異,可以把 PC(program counter)放在 draw_rectangle或是 draw_region 上,(看您用哪個方法)再按 RUN。要在某個運算子計算前中止程式,只要

在其前面放一個 BP(break point),按 Ctrl 鍵加上滑鼠左鍵即可加上。

3.6 尋找正確的運算子 上一個單元中已經做出了一個 HALCON 物件,接下來要如何選用 HALCON 的一千多個運算

子呢? 主要是根據所要進行的分析工作而定,這要依靠使用者的經驗以及對於影像分析領域

的知識。雖然如此,HALCON 還是提供了一系列的方法,使得選擇運算子更為正確而便利。

圖例 用"thresh"字串來選擇"threshold " 運算子

32

如果您知道運算子名稱的部分字串,只要在運算子視窗中的文字輸入欄輸入,所有含有符合

字串的名字就會列在 combo box 中。 每個 HALCON 的運算子都有 HTML 格式的說明,從 Help>HTML 啟動您預設的瀏覽器就可

以看。從這裡可以看到所有的影像分析模組,排列方式和選單中的 Operator 一樣。相關的運

算子間還有交錯的連結可以參考。 還有一個索引,包含了所有的運算子,您可以從這個索引直接跳到要找的 HTML 資料。 另外,還有一個 Suggestion>Keywords,提供您從一些功能上的關鍵字,讓您去找尋要用

的運算子。視窗左邊是分類的功能敘述列表,例如 3d-projection,Arcs 等等,用滑鼠點一下,

視窗右側會列出相關的運算子,在左邊多點幾下,右側的列表內容就會一直增加。要選用運

算子時,在右邊的列表中點一下, 就可以切到運算子視窗來作業。 選好了運算子,像是例子裡的 read_image,就可以從 operator knowledge base 中取得各類

參考資料。 HTML 格式的線上說明。 在運算子視窗中按下 Help,就會啟動預設的瀏覽器來顯示所有相關的說明。 選單 Suggestion>Altinatives 在計算個過程中若是覺得結果不完全符合需求,可以從這裡尋找功能類似而可能更合用的運

算子。要注意的是,通常您必須在速度和精度之間做一選擇,例如用速度較快的

mean_image 做為某種情況下的 filter,要求高品質的結果時,用 gauss_image 或是

smooth_image 。 選單 Sugestions>See also 這裡會列出另一類可能相關的運算子讓您參考,例如在用 read_image 時,列出 write_image。 選單 suggestion>Predecessor 許多運算子在運作時需要其他運算子提供計算參數或資料,這裡會列出先相關資料,例如要

用 junctions_skeleton 計算 skeleton 的交點時,要先用 skeleton 完成 region 之中 skeleton的萃取。 選單 Suggestion>Successor 和上一項建議相反的,某些運算子後面常常會接著一些特定的運算子做後續計算,這裡會提

出一些合理的運算子供您選擇。 到目前為止,我們的例子只是產生了一個新影像,而後續還有非常多可以選用的運算子來做

各式各樣的計算,我們暫且選用 successor 中建議的 threshold 來做下一步的運算。

33

3.7 找出正確的參數值 當您選擇了一個運算子,例如在程式碼上按兩下或從選單中選擇,運算子以及其相關變數會

出現在運算子視窗中。您可以自行鍵入所有參數,但是大部分的情況下,從 combo box 中選

擇適當的參數顯然最為便利,而一些參數的預設值,是由 HDevelop 所提供。 例如,從選單中 Operator>segmentation 選用 threshold 來處理影像,輸入的影像名稱由

combo box 中選"Die",參數中的 lower 及 upper threshold 的預設值,會使您輸入的影像,

以其中灰度值大於128的部分做為輸出的區域。輸出的影像名稱可自行名為 Brighregion。為了讓輸出區域顯示更為明瞭,可以更改圖形視窗的 visualization mode,由選單或是在圖形

視窗中按右鍵,在"Draw"中選"Fill",這樣就會使輸出區域填上顏色(顏色可由 Color 中選擇,

例如選綠色)。要觀察結果時,可以在圖像變數區,按兩下"Die"或是"Brightregion",影像和

處理後產生的區域即可以分別顯示。

圖例 "BrightRegion"中包含了灰度值大於等於128的像元 想要修改參數時,在程式碼上按兩下,就會出現對應的運算子視窗,然後您就可以修改參數。

這個時候您可以按 Apply,這個運算子會被立刻單獨執行並且顯示結果,這樣就不必一直從

頭再執行一次,參數的調整達到您要的效果以後,就可以按 OK,將修改部分寫入 program中。要注意的是,在每次顯示計算結果時要記得 Clear 畫面,或是將原始影像重新顯示一次,

以免顯示計算結果的區域或線條等等累積在畫面中重疊。

34

3.8 尋找 ROI 由影像"Die"中可以發現,由於線路版的部分比較亮,因此由 threshold 的預設參數 128 及

255,即可產生一個合理的 raw segmentation,然後把這個區域轉成一個 ROI,做為 bonding balls 偵測之用。選用 shapr_trans,以"Brightregion"為輸入區域,參數用"rectangle2",來找

出一個包含"Brightregion"最小的平行四邊型。輸出的 region 取名為"ROI",差不多就是電路

板的大小了。再來用 3.5 節的方法 reduce_domain,把原始影像約化成包含 ROI 的範圍。 threshold(Die,Brightregion,128,255) shape_trans(Brightregion,ROI,'rectangle2') reduce_domain(Die,ROI,DieROI) 接下來的計算,範圍就定在最後的 DieROI 這張影像。

3.9 從型態學的方法來找球型物體 觀察一下"Die"這張影像,您會發現這些 bonding balls 的部分比電路板上大部分區域還黑,

因此可以再用 threshold 來處理一次。

圖例 region "RawSegmentation" 包含了較黑的像元 影像中免不了會有雜訊而造成許多小洞或是小點,因此要用一個有適度限制條件的"填補"功

35

能,例如 運算子 fill_up_shape(在 Operator>Regions>Transformation)就頗合適。 threshold(DieROI,RawSegmentation,0,50) fill_up_shape(Rawsegmentation,Wires,'area',1,100) 此時,您可以在圖像上點兩下,比較 Wires 以及 RawSegmentation 這兩個變數的圖形有何

差異

圖例 用 open_circle 來移掉不要的部分 不過到此時,影像中除了 bonding balls 的部分之外,還有其他連接到 bonding balls 的深色

部分,而 bonding balls 本身很明顯是一個圓形,因此可以用 opening_circle 來移除非圓形的

部分。 opening_circle(Wires,BallRegion,15.5) 再看看 Wires 和 BallRegion 之間的差異。 現在留在圖面上的東西就剩下幾個,由圓形元素所填成的幾個物體,但是這些物體是包含在

影像中的,其實只是影像中的一些灰階特徵,如果要做後續計算時,必須把這些物體抽出,

變成一個個獨立的物體,這時候就要用到 connection 這個運算子。 connection(BallRegion,Balls) 經過這個運算,原本在 BallRegion 裡的物體就被拆成八個獨立物件,存放在新產生的物件叫

36

做 Balls,現在可以試試用不同的顏色表示。 Visualization>Colored 選12,這樣就可以見

到不同的物體分別被以不同顏色標示,這是 HALCON 非常重要的功能,這些所謂的變數並

不是只能有單一數值或資料項,它是一個tuple,而在運算子計算時,給予的參數可以

是一個 tuple,計算時就會處理資料所有物件,而不必再一個個分別計算,這時您就不必在程

式中安排迴圈來做這些重複的動作。 最後要找出圓形物體,此時要剔除其他非圓形物體就簡單多了,用 select_shape,在

Operators>Regions>Features 中,參數選用"circularity", select_shape(Balls,FinalBalls,'circularity','and',0.85,1.0) 現在再來看看 Die 和 FinalBalls 這兩個變數。FinalBalls 中只含有七個球狀物,這就是要找的

東西,下一個單元中會介紹如何量測。 以上所舉例子中,用到的運算子及計算的全部過程正如下列般簡單。 dev_open_window(0,0,-1,-1,black,WindowID) read_image(Die,'die3') threshold(Die,Brightregion,128,255) shape_trans(Brightregion,ROI,'rectangle2') reduce_domain(Die,ROI,DieROI) threshold(DieROI,RawSegmentation,0,50) fill_up_shape(Rawsegmentation,Wires,'area',1,100) opening_circle(Wires,BallRegion,15.5) connection(BallRegion,Balls) select_shape(Balls,FinalBalls,'circularity','and',0.85,1.0)

3.10 控制變數 現在我們已經找出了影像中的 bonding balls,接下來就可以做一些量測,例如說計算它們的

數量,用 count_obj(在 Operators>Object>Information 下) count_obj(FinalBalls,NumBalls) 和 3.5 節的 draw_rectangle1 類似的,現在又產生了一個新的變數 NumBalls。HALCON 提

供了許多的特徵辨認功能,(Operators>Regions>Features),現在可以再試試一個

smallest_circle,它的功能是在找出一個包含一 region 的最小圓,圓心位置以及半徑。 smallest_circle(FinalBalls,Row,Column,Radius)

37

FinalBalls 含有七個物件,也就是七個圓,所以輸出的資料 Row,Column,Radius 也都含

有七個資料,從變數視窗中就可以看到,要是物件含有的資料太多了,在視窗中無法一次完

全顯示,可以在要查看的變數上按兩下,會出現一個視窗來顯示全部資料。 接下來要對求得的控制資料作處理,這時要用到的是一些內建的功能,例如您可能會想要計

算 Radius 的平均值,而為了指定輸出的變數,用的功能是 assign,(在 Operator>Control下) assign(meanRadius,sum(Radius)/|Radius|) *注意,'||'中求的不是絕對值,而是 tuple 資料的數目,這個例子中就是7。 顯示在程式視窗中就如下列。 meanRadius := sum(Radius)/|Rdaius| 在品管方面比較合理的應用是計算球的面積,或是再找出最小面積,用 area_center(在Operators>Regions>Features 中),算出每一個球的面積,然後找出一個最小值,用 assign把值指定給 minArea。 area_center(FinalBalls,Area,RowCenter,Colcenter) minArea := min(Area) 控制變數的 tuple 也可以做為輸入的參數,例如,把計算出的圓畫在視窗中

disp_circle(WindoID,Row,Column,Radius),就可以畫出七個圓。

3.11 用 pattern 匹配來找尋 bonding ball 在上一節中介紹了利用 threshold 找出 ROI,再加上型態學的方法找出要的圓形,在這一節

中,要介紹的是用一種完全不同的方式來來找出標的物。進行 pattern matching 時有兩個基

本的步驟。 1.產生一個 template 2.在影像中找尋這個 template

38

圖例 影像中圈出的 template

在這個範例中,會介紹如何產生包含這個 bonding ball 的一個 template dev_close_window() 關閉圖形視窗 dev_open_window(0,300,-1,-1,'black',WindowID) 產生一個新視窗,並且產生一個

window 的 ID,供下一個運算子

使用 read_image(Die4,'C:\\Program Files\\MVTec\\HALCON\\images\\die4.tif') 讀取圖檔 draw_rectangle1(WindowID,Row1,Column1,Row2,Column2) 框取 template,取得座

標。 gen_rectangle1(ROI,Row1,Column1,Row2,Column2),用這組座標產生一矩形 reduce_domain(Die4,ROI,ImageReduced) 產生 ROI,名為 ImageReduced 現在 ImageReduced 中就只含有要搜尋的 bonding ball,再來就要產生一個 template,由

Operators>Filter>Match,選用 create_template create_template(ImageReduced,5,4,'sort','original',templateID) 為了要顯示 matching 的成果,需要計算 template 中心,用 assign 來指定計算出來的數值。 TemplRow := (Row1+Row2)/2 TemplCol := (Col1+Col2)/2 接下來就是進行 matching 計算,在這裡會用到兩種計算法,用兩個計算步驟,先用快速的

matching 來找出所有可能的區域,第二個步驟再用精確的計算,在每一個可能的區域中精確

39

定出正確位置。首先用的運算子是 fast_match,在 Operators>Filter>Match 下。 fast_match(Die4,Matches,templateID,20) 此時在變數視窗中 matches 上按兩下,畫面上會出現七個點,此時用的參數 MaxError 設2

0,這個容許誤差參數的調整影響到計算速度。用較小的數值可能會造成某些物體未被找出,

較大的數值則會增加計算時間。 除了 fast_match 之外,還有另一個運算子 fast_match_mg,可以調整不同的計算 level,您

可以試試不同的 level 對速度的影響。 fast_match_mg(Die4,Matches1,TemplateID,20,3) 在找出了可能的區域之後,接下來用 connection 把這些區域拆開,放進一個 tuple,做為最

後精確計算時的資料來源。 connection(Matches1,BallROI) 如果各種參數都設定得很適當,這個圖中應該會找到七個 region,我們可以用 count_obj 來確認數目 count_obj(BallROI,NumBall) 最後再用精確的匹配 best_match。但是在精確匹配之前要先做一個動作,由於 connection產生的物件 BallROI 是一個 region 的 tuple,本身不含影像資料,但是匹配計算需要依據原

始影像,因此要先在 region 中填入影像資料,用 Operators>Image>Domain 下的

add_channels add_channels(BallROI,Die4,BallImage) best_match(BallImage,TemplateID,20,'true'Row,column,Error) 此時在變數視窗中會顯示出計算出來的 Row,Column,Error 等等資料,在這些變數上按兩

下,就會出現一個小視窗,列出所有數值(應該有七個)。 最後為了顯示成果,可以在畫面上依據計算成果繪圖,在 Operators>Graphics>Output 下,

用 disp_rectangle1 disp_rectangle1(WindowID,Row+Row1-TemplRow,Column+Column1-TemplCol Row+Row2-TemplRow,Column+Column2-TemplCol)

40

由匹配找出來的區域會被標上框框,這樣就能很清楚的看到結果。 最後,如果這個 template 不再使用了,要用 clear_template 將其清除,這樣就可以將 template所佔用的記憶體釋放。

3.12 控制結構 HALCON 提供了一系列控制結構的邏輯和迴圈運算等等,讓您可以組成更複雜的功能,例如

用for組成迴圈,用if來進行判斷。 在上一節的例子中,我們用 best_match 的成果來顯示矩形,不過這樣萬一有計算失敗的情

況發生時顯示的矩形就會出問題,只要把 MaxError 調到5,就可以在畫面上看到發生了什

麼情況。在輸入的計算區中要是匹配失敗,Row 和 Column 會變成0,Error 值變成255。

為了修正這個問題,我們可以設計一個迴圈,且加入一個判別式,在 Error 值小於255,

也就是計算成功的情況下才顯示矩形,同時我們也可以據以統計真正計算出的物體數目。先

設一個變數當記數器,起始值為0。 RealNumBalls := 0 再來建立一個迴圈,計數器用 i,end value 用 NumBalls,這個迴圈裡會判別成果是否正確,

然後才顯示矩形,同時累計正確的成果數目。 for i := 1 to NumBalls by 1 if (Error[i-1]<255) disp_rectangle1(WindowID,Row[i-1]+Row1-TemplRow,

Column[i-1]+Column1-TemplCol Row[i-1]+Row2-TemplRow,Column[i-1]+Column2-TemplCol) RealNumBalls := RealNumBalls + 1 end if endfor 這樣一來,計算成功的地方才會顯示框框,而計算失敗時就不顯示,即可避免將框框以(0,

0)為中心畫在畫面上。

41

第四章 HALCON 之設計哲理

4.1 模組架構

HALCON最基層的東西是 data management以及 operator knowledge base。 data management負責基本的記憶體管理,影像處理的存取,圖像物件 tuple的增刪等等。knowledge base儲存了運算子的資料,可在作業時同時取用,其他的模組用它來處理影像資料,取得系統狀態以及設定值資料等等。 knowledge base也用於產生 HALCON的語言介面(C,C++,COM),運算子的所有資料在HDevelop,線上說明以及手冊中。同時也含有每個運算子的名稱,參數形式,注意事項,預設值等等。這些解說資料按照一定的結構排列。 在這兩個模組上層的是運算子,大部分都是在 HALCON Image Processing Library之中,而這些模組可以透過所謂的 Package來新增或延伸功能,這些新增的運算子和 HALCON原有的運算子有同樣的特性和運用方式,因此系統的功能變成非常有彈性。利用相似的概念,

Frame Grabber Interface也是用動態的 library,因此使用者可以自行新增和新取像設備連結的介面,不必去更動系統的其他部分。 接下來是的模組是 Language-Independent Operator Interface,包含了呼叫運算子,資料輸

入輸出,以及傳到最後輸出的程式語言供使用者撰寫程式。運算子的功能是由 Language Interface 呼叫,這個介面是根據運算子的基本資料再編譯輸出而成的,它使您能夠以自己撰

寫的 C 或 C++,COM 等等程式中使用 HALCON 的計算功能。

42

4.2 iconic 和 control 資料的處理 HALCON 系統下有兩種主要的資料型態,iconic 和 control 資料。iconic 資料是和原來的影

像相關的,例如說影像,region,XLD物件等等,而 control 資料包含各類的數值資料,像

是整數,浮點數,字串等等,用以定義輸入值,參數,建立更複雜的資料像是 bar chart,變

數陣列等等,而 HALCON 在處理這兩種形式的資料時,都是以 tuple 的型態在處理的。 4.2.1 tuple 的處理 HALCON 運算子的各種輸入輸出參數,只要是含有資料的,其內容可以是單一的物件或是

物件/數值的 tuple,HALCON 在計算時同時會計算 tuple 中所有物件。例如說您要對六張影

像做 filter 處理,可以使用 median_image 六次,也可以將六張影像讀進一個 tuple,然後呼

叫 median_image 一次。當輸入一個 tuple 時,HALCON 就會同時對六張影像作處理,然後

輸出一個 tuple,其中含有六張處理過的影像。在第三章的例子中,從影像中取出的數個 region變成了 tuple,如果要求取每個 region 的中心,只要把這個 tuple 做為 area_center 的輸入參

數,輸出的 tuple 就包含了這些 region 中心位置的座標組。 4.2.2image 物件 image 物件中包含了像元資料。它本身可以是 tuple,含有一張或是多張影像,每個影像物件

本身含有一個 domain,記載了面積,範圍,以及一或多個頻道的灰度值資料,而頻道的數

目沒有限制,一個單色影像只有一個頻道,一般的全彩影像有三個(RGB),多光譜影像可能

就更多。 影像的 domain 可以是任何尺寸,其範圍是以 region 表示,所以其中可以有空洞,或是有數

個彼此不相連的區域,一張影像預設的 domain 即是包含該張影像的最小矩形。domain 可以

任意修改變形,而每一張影像都有個別的 domain。 每張影像給定其定義區域有其好處,所有的運算子在做計算時都只在 domain 的範圍內計

算,也就是在 ROI 中計算,因此待計算資料減少,速度得以加快。HALCON 提供了一個範

例 autobahn.dev,位於 %HALCONROOT%\examples\hdevelop\Applications\Sequences

43

圖例 image object 的架構

圖例 各種不同形狀尺寸的 region

44

4.2.3 region 物件 region 記載了影像中的特定區域資料,例如說影像中明亮的部分,region 物件中可含有一個

以上的區域資料,這些資料是彼此互相獨立的,而且即使記載了某張影像的區域,這些資料

和影像本身並非直接相關。這種設計使得 region 的資料可以是任意形狀尺寸,而且儲存時非

常有效率。在記憶體中的 region 資料和影像灰階資料是分離的,即使 region 有互相重疊時,

記憶體中的影像陣列不會受到任何影響。 region 的紀錄方式是由 runlength encording 演變而來的,稱之為 chord encording,紀錄的

是每一條弦(線)的起訖點資料,這種方式使得 region 資料佔用極少的記憶體資源,而且在做

計算,尤其是型態學的計算有很好的效率。 region 既然沒有尺寸的限制,因此它甚至於可以超過原始影像尺寸,這在應用上有其長處,

例如 region 中含有圓形特徵物體,且要將邊緣圓滑來去掉一些缺角或漏洞,例如用

closing_circle 做運算。另一個例子是去掉物體上的鰭狀突出,(HDevelop 的例子 fin2.dev,位於%HALCONROOT%\examples\hdevelop\Applications\FA),這是利用同一個圓形元素來

做邊緣的擴張和收縮,圓半徑250,這個半徑似乎很大,但是對 HALCON 來說不是問題,

計算後的區域就把突出物去掉而變平滑。如果 region 被限制在影像大小的區域,擴張和收縮

兩個步驟後的區域形狀就無法去除突出物。

圖例 利用 region 來做邊緣處理

45

4.2.4 XLD物件 XLD是 eXtended Line Description 的縮寫,這種資料結構用於紀錄區域,例如任意尺

寸的區域或是多邊型,開放或是封閉的等值線,直線等等。和 region 物件不同的,region 的

紀錄精度是以像元為單位,而XLD物件以次像元精度來記錄。XLD物件有兩種基本結構,

等值線和多邊型。 XLD 物件的建立方法是由線(等值線,邊緣等等)上的取樣點連接而成,藉由改變取樣密度和

位置,可以提高精度,此外還包含了角度,弳度等等資料。一般來說,XLD 記錄了邊緣偵測

計算的結果,例如 edge_sub_pix,lines_gauss 等等。進一步的,可以用在次像元精度等級的計算及應用。詳

細的資訊請參考 Extension Package Programmer's Manual。

4.3 HALCON 的取像介面 目前 HALCON 提供了40餘種取像介面,以 DLL 方式載入(dynamically loadable libraries,unix 下為 shared library),這些 library 是以HFG為檔名開頭,而為 parallel HALCON 設計

的 DLL 以 parHFG 為開頭(請參考 5.3.2 節)。 HALCON 利用 Frame Grabber Interface,和取像設備商提供的驅動程式連結,由下列的運

算子構成了通用的溝通方法。 open_framegrabber 啟動取像設備並設定參數。要設定的參數依設備的不同而異,例如相機形式或是連接的 port。 info_framegrabber 傳回取像設備資訊,例如預設值等等。 set_framegrabber_param 以及 get_framegrabber_param 設定或取得取像設備的參數。 grab_image grab_image_async 取像。兩者的差異(同步及非同步)請看下一節的說明。 grab_image_start 開始非同步取像。 close_framegrabber close_all_framegrabbers 停止和取像設備的連結。同時會釋放佔用的系統資源。

46

set_feamegrabber_lut get_framegrabber_lut 設定或讀取取像設備的 lookup table,這個功能只有一些特定的取像設備才支援。 如果您的取像設備安裝好了,要和 HALCON 連接,只要叫用 open_framegrabber,給他取

像設備名稱,例如相機形號等等參數,再來用 grab_image 就可以取得影像。 有件事要請使用者注意,就是 HALCON 的取像介面經常會更新,主要是因為 MVTec 持續的

在開發新的介面,另一方面,如果取像設備製造商更新了軟體,HALCON 也會跟著更新。最

新的資訊在 http://www.mvtec.com/halcon/framegrabber 可以找到,包括可下載的 DLL 以及

相關參數等等。

4.3.1 兩種取像模式 HALCON 有兩種取像方式,同步與非同步取像。所謂同步取像,是由程式以 grab_image 通

知取像器取像,接著程式開始等待,一直到取像完成。也就是說,程式和取像器同步作業。

這種模式的好處是取得的影像是最新的,不過由於取像需要時間,像是 PAL 影像,需時40

ms 左右,造成的結果就是難以進行即時計算。如果取像還要再配合外部觸發訊號(trigger),耗費的等待時間就更多。 另一種模式,非同步取像,則可支援即時運算。這種模式下取像分為兩個階段,第一,程式

以 grab_image_start 通知取像器開始進行取像,運算子會立刻回應,程式就可以繼續未完成

的工作,例如處理上一張影像,而取像器可同時進行取像作業。再來要取得影像時,呼叫

grab_image_async。如果取像完成了,運算子會立刻傳回新取得的影像,否則就會一直等到

取像完成。grab_image_async 還有一個功能,它可以限定影像的有效時間,若是間隔太久,

就會自動抓取一張新影像,以確保取得的影像是最新的。在傳回影像前,grab_image_async會自動開始抓取新影像,因此您不必再呼叫 grab_image_start 開始取像。 兩種取像方式中,非同步取像可以發揮最大的系統效能,由於計算(程式端)和取像(設備端)是獨立執行的,因此不會有互相等待而牽制的情況,但是對設計者而言,時間點的掌控因而

更形重要。

4.3.2 使用外部觸發(External triggers) 除了上兩種取像方式外,若是您的取像系統有此功能,就可以使用外部觸發來直接命令相機

取像,這樣可以整合其他的自動化設備,例如和一個光電感應器連結,當工件通過相機時就

照相。對 HALCON 來說,只要修改 frame_grabber 的參數即可搭配此類應用。 這種同步方式和上一節講的同步取像有些基本上的不同。上一節敘述的方法中,影像處理的

計算和取像同步,也就是取完影像才開始計算,而使用 external trigger 時,是收到觸發訊號

就開始取像,因此取像是依據某種條件進行的,而不是由程式下令。

47

大部分的 HALCON frame grabber interface 都可以設定一個逾時限制,可用

set_framegrabber_param 來設定,如果一個取像的動作逾時未完成,則會傳回

H_ERR_FGTIMEOUT。 有件重要的事要注意,為了使外部訊號和取像時間一致,相機本身必須要能隨時開始擷取新

影像,一般稱之為 asynchronously resetable,也就是相機在收到訊號時,可以立刻中止

尚未完成的取像動作,然後進行新影像的擷取。如果沒有這項功能,收到外部訊號到相機開

始取像之間會有時間差,而對於即時的計算應用而言,更糟糕的是這個延遲的時間不是定值,

可能趨近於0,也有可能接近擷取一張影像所花的時間。 綜合上述,對於要求條件嚴格的即時取像應用,要使用外部觸發訊號,同時就要選擇有

asynchronously resetable 功能的相機。

4.3.3 Volatile 取像 在預設的情況下,grab_image 和 grab_image_async 是將取像系統取得的影像複製到

HALCON 影像物件所用的記憶體中,這種方式的好處是程式在計算時,新擷取的影像不至於

覆蓋掉原先運算到一半的影像資料,此外,程式也可以對先前處理過的影像做一個 history。 由於影像的複製要花時間,像是 NTSC 影像要花2-3ms,在一些對即時性要求嚴苛的應

用上會出問題,因此某些 HALCON 的取像介面提供了所謂 volatile grabbing mode。這種模

式下,取像器會直接將影像資料寫進 HALCON 影像物件記憶體中,因此少了複製的動作時

間。不過就另一方面來說,新讀取進來的影像會蓋掉舊的影像。 至於哪些 frame grabber interface 有支援,請查看相關手冊。

4.3.4 使用 HALCON 未支援的取像設備 如果您使用的取像設備 HALCON 並未支援,一樣也可以將它和 HALCON 整合在一起。這部

分請參考 Frame Grabber Intergration Programmer's Manual,以及其中的範例程式碼。 如果您已經使用 frame grabber 所提供的 API 來取像,要讓 HALCON 處理您的程式所取得

的影像資料,只要將您程式中儲存影像的 buffer 指標傳給 HALCON,用 gen_image1_extern即可。

48

4.4 HALCON 的使用極限 影像尺寸 32768*32768 記憶體中影像陣列數目 100000 每個參數包含的物件數目 100000 每張影像的頻道數 1000 tuple 中的數值資料數目 1000000 一條等值線上的取樣點數目 30000 一個多邊型上的控制點數目 10000 影像座標 -32768 到 +32768 字串長度 1024 個字元

49

第五章 使用 Parallel HALCON 本章介紹如何使用 parllel HALCON,以及其特性,平行處理機制,以及對於撰寫平行運算程

式的支援。 如同標準版的 HALCON,要使用 parallel HALCON 有兩種方式,一種是用它提供的 libraries來撰寫程式,另一種是使用'parallel'版本的 HDevelop,即所謂 parallel HDevelop。 parallel HALCON 以及 HDevelop HDevelop 有兩種版本,一種是標準版的,使用的核心是一般的 HALCON library,就是上一

章解說以及範例中執行的程式 hdevelop。另一種是依據 Parallel HALCON library 而產生

的,這個版本在多處理器的電腦上會自動做平行處理,對應的程式是 parhdevelop。 在獨立的程式中使用 parallel HALOCN 如同標準版的 HALCON,要自行撰寫支援平行運算功能的程式,就要 link 相對應的 library。在 Windows/NT/2000/XP 下,需要 parhalconc.dll 或是 parhalconcpp.dll,在 UNIX 下,需要

的 library 是 libhalcon.so,依據程式語言的不同,還需要 libparhalconc.so 或是

libparhalconcpp.so,詳細的資料請參考 HALCON/C 或是 HALCON/C++的 User's Manual。

5.1 Automatic parallelization 如果 Parallel HALCON 安裝在具有多處理器的電腦上,它會自動將處理影像的運算子做平行

化的處理。 5.1.1 Parallel HALCON 的初始化 為了要使平行計算機制調整到符合您使用的電腦,Parallel HALCON 會做一次硬體的檢

查,之後要使用平行運算時就不必再調整。檢查的方法,是由 parallel HALCON 呼叫

check_par_hw_potential,要注意的是,從標準版的 HALCON 執行這個運算子的話就會出現

錯誤訊息。同樣的,如果您在單處理器的電腦上執行這個運算子,也會出現錯誤訊息。這個

檢查功能可以單獨執行,執行檔為 hcheck_parallel.exe,位於

%HALCONROOT%bin%ARCHITECTURE%下。 Parallel HALCON 藉由呼叫 check_par_hw_potenial 來檢查每個運算子在做平行化以後的

效率提昇程度。每個運算子都會做數次平行以及循序式的測試運算,同時會改變參數來測試

其效能。經由這個測試,程式會找出不同參數對計算的影響,例如說影像大小等等,以及資

料平行處理的效率提昇程度。這個過程可能會花上10分鐘(依電腦效能而異)。 由這個過程取得的資訊,在 Windows NT/2000/XP 下,存放在 Registry 中,在 UNIX 下存於

50

檔案.halcon_par_info 中,置於$HALCONROOT 目錄下。有些作業系統下,使用者要有特定

的權限才能進行這個初始化的動作,否則 check_par_hw_potenial 在執行完後無法儲存取得

的資訊。例如在 Windows2000,必需要有 administrator 或是 group privilege 之'Power User'權限。UNIX 下的預設情況是安裝 HALCON 的使用者才能新增或修改.halcon_par_info 這個

檔案。必須注意的是,check_par_hw_potenial 在無法儲存相關資訊時不會傳回錯誤訊息。

但是程式 hcheck_parallel 會先檢查權限和寫入限制,有問題時會先傳回相關的錯誤訊息。 5.1.2 三種資料平行處理的層次 Parallel HALCON 利用資料分散的方式來使得運算子能夠自動的進行平行處理,例如輸入資

料的不同部分可被拆開分別獨立處理,這種方式有三種層次。 tuple level 當某個運算子的參數中含有 tuple 形式的資料,則這些 tuple 中的物件或資料可以被分散到不

同的執行緒中做平行計算,但是這個做法有其條件限制,就是含有 tuple 資料的各個參數,

tuple 中所含資料項的數目必須是一致的,或是都只含有一個。 channel level 當一個運算子的輸入影像非單色影像,而是多頻道影像,例如全彩影像或是多光譜的遙測影

像等等,不同的頻道影像資料會被分散到不同的執行緒中做平行運算。不過其條件限制是所

有輸入的影像其頻道數目必須一致。 domain level 運算子計算時的 domain 也可以分成數個部分,分散到不同的執行緒同時計算。 在 HALCON 之 Reference Manual 裡,每一個運算子的說明中都含有一項"Parallelization Information",說明了每一個運算子可以做到的平行化程度,也就是 tuple,channel,domain等等。

5.2 使用 Parallel HALCON 的功能來撰寫具平行計算能力的程式 Parallel HALCON 本身具有 thread-safe 以及 reentrant 的特性,例如不同的執行緒可以同時

呼叫同一個運算子而不必互相等待,不過並不是所有的運算子之 reentrant 的程度都一樣。

這個章節介紹了 reentrancy 特性的相關說明,以及設計程式時的注意事項。範例程式為

example_multithread1.c。

51

5.2.1 關於 reentrancy 的進一步說明 Reenrancy 也有不同的層次,說明如下。 reenrant 這個層次的運算子可由不同的執行緒同時呼叫,而且與其使用的 data 互相獨立,不會因為資

料而影響其獨立運作的特性。 local 這個層次只在 Windows NT/2000/XP 下有意義。 屬於 local 層次的運算子必須要由主執行緒(主程式)呼叫,而不能由其他執行緒叫用,最典型

的例子是有關圖形以及 IO 控制的運算子,這是因為在 Windows 系統下,執行緒與圖型介面

之間有直接的對應關係,例如視窗,對話框,按鈕等等,也就是每個圖形顯示介面都有個別

的執行緒在控制,如果某個執行緒要對另一個執行緒所對應的圖形介面像是視窗等等做修

改,系統會因此打結。例如,您在某個執行緒中用 open_window 開了一個視窗,卻在另一

個執行緒中用 draw_circle 在這個視窗中畫圓型。 有些運算子並非完全以圖形元素為參數或是與其相關,但是在某些情況下卻會處理到圖形介

面等等,這一類的運算子都被歸類於 local,事實上在主執行緒以外還是可以另行叫用,只是

有可能會遇到問題。 single write muliple read 某些運算子只有在不同的執行緒分別處理不同的資料時,也就是資料不重疊時,才能同時叫

用。例如做 pattern matching 時所用的 template,要用 adapt_template 對它作修改時,不同

的執行緒若是對同一個 template 做處理,就會出問題。此外,當某個執行緒在讀取某個資料

時,就不應該用另一個執行緒同時企圖修改該項資料。另外一組有類似操作限制的運算子是

和檔案 IO 有關的,例如 write_image,read_image,fwrite_string,fread_string 等等,其實

即使不是 HALCON 提供的功能,也有類似的限制。另外一個例子是 update_bg_esti 或是

give_bg_esti。這類運算的多執行緒通常並不建議使用,所以 HALCON 也不會主動的去做限

制,但是當您無意間用不同的執行緒去處理相同的 data 時,可能會得到不可預期的結果。 mutual exclusive 某些運算子本身不能同時由多個執行緒重複叫用,但是可以和其他的運算子同時執行,例如

combine_road_xld,concat_ocr_trainf。 completely exclusive 這一類的運算子執行時,就不能同時執行任何其他的運算子,像是和 OCR/OCV 有關,修改

OCR classificaion 的運算子,增刪檔案,或是 reser_obj_db。此外,設計人員必須確認的是,

要執行 reset_obj_db 前,必須先確認所有先前執行的運算子及其執行緒都已執行完畢。

52

5.2.2 Style Guide Initialization 在一個多執行緒的程式中,要執行運算子前,要先呼叫一個運算子讓 HALCON 做內部結構

上的初始化。建議的運算子是 reset_obj_db。 I/O 在 WindowsNT/2000/XP 下,和 IO 有關的運算子像是 open_window 或是 disp_image 等等,

只能由主執行緒呼叫,在 Reference Manual 中,這就是所謂 locally reentrant,如 5.2.1所敘述。只要有檔案增刪等等動作,其他的執行緒就必須等待。 Multithreading 以及 Automatic Parallelzation 在一個多處理器電腦上執行的多執行緒程式,最好是將自動平行化機制關閉,這樣可以求得

較好的效率。

5.3 附加資訊 5.3.1 如何將 Reentrancy 或是自動平行化機制關閉 透過 set_system,您可以將 HALCON 的部分功能關閉,例如自動平行化機制 set_system('parallelize_operators','false') 關閉 reentrancy set_system('reentrant','false') 要恢復功能,用同樣的運算子,第二個參數改成'true'即可。要注意的是,如果關閉了

reentrancy,就同時也關閉了 automatic parallelization。關閉這些功能的前提是您確定不會

用到,並且要以此省下過度的分散計算造成的時間浪費。 關閉平行化機制的理由之一是為了 debugging,或是您的程式對執行緒自有安排,不希望受

到自動機制的干擾。當然,如果您在單處理器的電腦上執行 Parallel HALCON,HALCON 就

不會做任何調整動作,所以您也沒必要將這個機制關閉。

53

5.3.2 在 Parallel HALCON 中使用取像系統 標準版 HALCON 支援的取像器,在 Parallel HALCON 中都可以使用,不過所有的取像器運

算子都不會被做平行化的處理,大部分的運算子都是'reentrant',但是和取像器直接連結的,

都是'completely exclusively'例如 open_framegrabber,info_framegrabber,close_framegrabber,close_all_framegrabber 等等。 屬於'local'層次的運算子在 Windows NT/2000/XP 下只能由主執行緒呼叫。 在 Windows NT/2000/XP 下,每個取像介面都包含了兩個 DLL 檔,一個是給標準版 HALCON使用的,以 HFG 為檔名開頭,另一個是給 Parallel HALCON 使用的,以 parHFG 為檔名開

頭,這兩種版本的 HALCON 會自動的載入對應的 DLL 檔。 在 UNIX 下,這兩種版本的 HALCON 都是用同一個 shared library。 5.3.3 Extension Package 以及 Parallel HALCON Extension Package 若要在 Parallel HALCON 中使用,就要另行提供一個以 par 為檔名起始

的 library,例如在 Windows NT/2000/XP 下,某個名為 halconuser 的 package,Parallel HALCON 會去尋找名為 parhalconuser.dll 的 library。相對的,在 UNIX 下,就是

libparhalconuser.so。 5.3.4 Parallel HALCON 以及 HALCON Spy HALCON Spy 不能用於監視 Parallel HALCON。

54

第六章 疑難排解

6.1 如何取得 HALCON 的最新消息 在您使用 HDevelop 時,從選單之 Help>HALCON News (WWW)即可啟動您預設的瀏覽器連

結到 MVTec 的網站,在這裡可以找到新的 extension package,取像介面,以及 HALCON的最新版本等等資訊。

6.2 在 Windows NT/2000/XP 下的建議事項 在 Windows NT/2000/XP 下,使用者介面中視覺效果的設定會影響系統速度,建議將其關閉。

由桌面上按右鍵,由'內容'中的'效果',將選項關閉即可。

6.3 HDevelop 的線上說明 HDevelop 提供了相當廣泛的說明,如下列。 System suggestions 系統由 operator knowledge base 為基礎提供選擇運算子 的建議,這裡就提供了選擇合理的

predecessors 以及 successors 的建議。如果要試著使用不同的影像處理方法,可以由

altinatives 以及 reference 來找尋可用的運算子。如果您只記得運算子名字的一部份,您可以

只輸入這些關鍵字,系統就會把所有名稱符合的運算子都列出來供您挑選。 Online help on operators HALCON 對所有的 HDevelop 運算子提供了詳細的線上說明,這些說明按照的一定的結構

排列,讓您易於查閱及了解這些運算子的內容。此外還有 cross reference,可以迅速的查閱

相關的運算子。以上這些說明文件只要用 HTML 的瀏覽器即可閱讀。 Debugging help 您可以用數種模式來執行程式,可以以程式碼一行行為單位,一步一步執行,也可以設定中

斷點,當然也可以一次連續的執行到底。為了對 debugging 提供有效的支援,環境變數

HALCONSPY 必須予以設定,這部分請參考 2.4.2 節的說明。 Result Visualization HDevelop 的介面設計讓您可以立刻看到運算子計算後的結果,這種視覺化的功能使您可以

在最短的時間裡找到計算的問題,例如參數的值。此外,輸出介面也可以修改,讓您可以用

最容易明瞭的方式展現結果。

55

6.4 用 HALCON Spy 來監看程式的執行 使用 HALCON Spy,可以監看運算子的數入輸出變數資料,並以圖形或文字的方式表示,方

便您進行 debug。 在 HALCON 的程式中,用運算子 set_spy 即可啟用 HALCON Spy。 set_apy('mode','on') 除了這個方法以外,在一個 Link 好的程式中要使用 HLACON Spy,只要將環境變數

%HALCONSPY%設好即可。設定方法請參考 2.4 節。 監看的模式可以由 set_spy 設定,例如下列。 set_spy('operator','on') set_spy('input_control','on') 如此一來,所有叫用的運算子名稱以及輸入輸出的變數都會顯示。顯示模式也可以由環境變

數中設定,在 Windows NT/2000/XP 下,可將環境變數%HALCONSPY%的值設為 operator=on;input_control=on 這樣的設定結果就和先前用 set_spy 的例子是一樣的。在 UNIX 下,兩個變數之間要用':'冒號

分隔。

6.5 疑難排解 這裡說明在安裝,解除安裝,使用 HDevelop 以及 Parallel HALCON 時遇到的錯誤訊息以及

排除方法。 6.5.1 安裝時的問題 Registration of halconx.dll failed 在某些系統上,可能會遇到 HALCON/COM 的 library halconx.dll 發生無法完成 self-register的警告。可能的原因之一是 Microsoft 本身的 atl.dll 在 register 時出問題(這個 library 位於

%SystemRoot%\system32 下,例如 C:\WINNT\sysem32),要將這個 library 完成註冊,請

依下列程序執行。 開啟一個 DOS 視窗,將目錄切換到 CD 上的 misc\i586-nt4,然後執行註冊程式。

56

>E: >cd misc\i586-nt4 >reg-halconx atl.dll >reg-halconx 安裝以及解除安裝 license manager daemon 萬一使用 floating license 所需要的 FlEXlm license daemon 沒有裝好,就要以手動方式另行

安裝。開啟一個 DOS 視窗,輸入下列指令。(注意,這是一整串指令) "%HALCONROOT%\FLEXlm\i586-nt4\installs" -n "HALCON License" -c "%HALCONROOT%\license\license.dat" -l "%HALCONROOT%\license\license.log" -e "%HALCONROOT%\FLEXlm\i586-nt4\lmgrd.exe" 安裝成功以後,在 控制台>系統管理工具>服務 中,就會看到一個名為"HALCON License"的 service。 要解除這個 daemon,指令如下列。 "%HALCONROOT%\FLEXlm\i586-nt4\installs" -r -n "HALCON License" 6.5.2 解除安裝時遇到的問題 Unregistration of halconx.dll 如果您在先前用手動方式 register HALCON/COM 介面的 halconx.dll,而現在要將

HALCON 解除安裝時,必須以手動方式先將 halconx.dll 做 unregister。 開啟一個 DOS 視窗,將目錄切換到 CD 上的 misc\i586-nt4,然後執行註冊程式。 >E: >cd misc\i586-nt4 >reg-halconx /u 移除 license manager daemon 如同 2.2.1 節所敘的,要移除使用 float license 的 HALCON 5.0 或 5.1 版時,有時會遇到 FlEXlm license daemon 沒有移除完全。要將其移除,請在進行 uninstall 前,以如下的手動

方式進行。開啟一個 DOS 視窗,輸入 "%HALCONROOT%\FLEXlm\i586-nt4\installs" -r -n "HALCON License" 由於在 DOS 命令提示模式下輸入的路徑名稱中不能含有空格,所以如果您將 HALCON 裝在

像是下列的目錄,

57

c:\Pregram Files\MVTec\Halcon 在輸入時就必須改成(這是一整行) c:\Progra~1\MVTec\Halcon\FLEXlm\i586-nt4\installs -r -n "HALCON License" 否則就以下列的輸入方式(這是一整行) "c:\Program Files\MVTec\Halcon\FLEXlm\i586-nt4\installs"-r -n "HALCON License" 當然也可以先切換到程式所在的目錄 cd "%HALCONROOT%\FLEXlm\i586-nt4" 再執行程式來解除登錄 installs -r -n "HALCON License" 關於 Internal Error 若是在解除安裝的過程中遇到下列的訊息 "Inter Error,unable to load or call external DLL.Please contact your distributor for more information" 最有可能的原因是安裝新版時,未先將舊版的東西完全移除,另一個可能的原因是 安裝時的目錄有所更動,或是環境變數%HALCONROOT%經過手動修改。 遇到這類的情況請依下列步驟來排除問題。 1.檢查環境變數%HALCONROOT%的內容,看看是不是和您安裝 HALCON 的目錄相符。

檢查的方法是由 我的電腦>控制台>系統>進階>環境變數 來查看,或是在 DOS 命令提示符

號下,鍵入 echo %HALCONROOT% ,也可以查看變數內容。如果變數內容是空的或是

其中的路徑內容並非您安裝 HALCON 的目錄,必須再從控制台中以手動方式去修改。 2.檢查下列兩個檔案在不在 在%HALCONROOT%下, Unins.isu 在%HALCONROOT%\FLEXlm\i586-nt4\下, HalconUninst.dll Uninst.isu 這個檔案在安裝時就會自動產生,如果沒有這個檔案,就無法進行自動的解除安

58

裝,HalconUninst.dll 是專為 HALCON 解除安裝而設計的,如果不見了,可以從 HALCON的 CD 上複製一份,檔案位於 FLEXlm\i586-nt4\下。 3.檢查 Windows 登錄檔中關於 Uninstaller 的設定。 啟動登錄檔的編輯程式 regedit,找到下列登錄項目, HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows-> CurrentVersion->Uninstall->Halcon<Version-Number> 這裡的<Version-Number>即是您想要移除的 Halcon 版本名稱(或是不在電腦中的),另外還

有一個機碼名稱為 'UninstallString',其字串內容應該有如下列(或類似), c:\WINNT\IsUninst.exe -f"c:\Program Files\MVTec\Halcon\Uninst.isu" -c"c:\Program Files\MVTec\Halcon\FLEXlm\i586-nt4\HalconUninst.dll" 當然要確定 c:\Program Files\MVTec\Halcon\是實際的安裝路徑,同時和環境變數

%HALCONROOT%是一致的。要注意的是當路徑中含有空格,像是 Program Files 之類的,

此時就要將整個路徑用引號' " '括起來。如果您發現路徑之中含有空格而沒有用引號,請自行

加上。 4.最後,關閉 regedit,重新再試一次 uninstall。 遇到 uninstallation failed 若是遇到解除安裝無法自動進行,則以下列手動方式進行。 1.使用 floating license 版本的,先以下列指令將 license manager service 關閉。 "%HALCONROOT%\FLEXlm\i586-nt4\installs" -r -n "HALCON License" 2.用 regedit 將下列機碼刪除 HKEY_LOCAL_MACHINE->SOFTWARE->Microsoft->Windows-> CurrentVersion->Uninstall->Halcon<Version-Number> 以及 HKEY_LOCAL_MACHINE->SOFTWARE->MVTec 3.用檔案管理員,刪除下列目錄 %SystemRoot%\Profiles\All Users\start Menu\Programs\Halcon 通常%SystemRoot%是 c:\winnt

59

4.最後,刪除 Halcon 的安裝目錄 %HALCONROOT% 6.5.3 和 license 有關的問題 如果您遇到和 license 有關的問題,像是 license file 的位置無誤,但是卻出了問題,首先要

先確定電腦或 dongle 的辨識資料(請看 2.3.1 節)和 license file 所載內容是否一致(請看 2.3.3節)。如果這兩者不相符,請送一份新的辨識資料到代理商,如果在取得辨識資料方面出問題,

請看以下的說明。 floating license 的使用者,請參考 2.3.4 節,尤其是選擇適合的 port 供 license manager daemon 的部分。 dongle 的使用者,若您的 HALCON 版本是 6.0.2 版或更新的,遇到"license not found"的訊

息,則建議您依照 2.3.5.1 節的方法將舊的 dongle driver 移除,再安裝新的驅動程式。 6.5.3.1 取得辨識資料上的問題 HDevelop 沒有顯示任何 host ID 如果您的電腦有網路卡,有 dongle,使用 Pentium III,卻沒有取得任何 host ID 資料,則請

用 2.3.1.2 節的方法來取得。 網路未使用時即無法取得 licensing 在 Windows 2000 及 XP 下,如果您的網路卡並未和網路相連,必須將 Media sense(DHCP)關閉,通常這種情況只要將 DHCP 關閉即可,這方面問題的詳細說明可以參考微軟公司網站

http://support.microsoft.com/support/kb/articles/q239/9/24.asp. lmhostid -ether 傳回 "ffffffff"或"0" 通常這個情況代表您的電腦上沒有網路卡,如果網路卡確實已經裝了,Windows2000/XP 的

使用者請檢查 client for Microsoft network 是否有安裝。可由"網路芳鄰"按右鍵選擇內容,選

"區域連線"之內容,看看是不是有這個通訊協定。如果沒有,請將其安裝。 安裝完成後再依照 2.3.1.1 或是 2.3.1.2 的方法嘗試。 在 NT 下,請檢查 NetBEUI 或是 TCP/IP 是否有安裝。 一張網路卡卻有好幾個 ID 在 Windows2000/XP 下有時會遇到這種情況,這種情形下選擇的方式是重新開機後依然不變

的,或是將 NetBEUI 以及 IPX/SPX 關閉後仍然存在的。

60

lmhostid -cpu64 傳回 "" 如果 lmhostid 傳回的資料像是下面的東西, >lmhostid -cpu64 lmhostid - Copyright (C)1989-2000 Globetrotter Software,Inc The FLEXlm host ID of this machine is "" lmhostid:FLEXlm function not available in this version <-45,520> 這代表您電腦的處理器沒有提供 CPU ID。通常這是像 2.3.1.2 節所說的,在 BIOS 中的設定

關閉了,只要在 BIOS 的設定中將其開啟即可。 lmhostid -flexid 無法傳回 dongle ID 若是 lmhostid 無法傳回印在 dongle 背後的 ID,請用 2.3.5 節的方法檢查驅動程式是否裝好。

如果驅動程式確實裝好了,請檢查您的電腦 USB 或是 parallel port 是不是有問題。 6.5.4 關於 HDevelop 的問題 這裡提出一些執行 HDevelop 時遇到的一些錯誤訊息,發生的原因,以及其解決方法。 No license found 造成這種問題有幾個可能原因 %HALCONROOT%\license\license.dat 這個檔案不見了或是無法讀取。 這個 license 不是用於這台電腦 在 floating license 使用者遇到的,可能是線上使用者過多。 lost connection to license server 首先先確定 license server 是否有在運作。另外也檢查您的電腦是不是有和 server 相連,這

方面的問題可能要由系統管理員處理。 No license for this operator 這表示您目前的 license 並未包含對這個運算子的使用授權。請重新取得一個包含這個模組

的 license。 Wrong architecture 您的電腦硬體並不適用安裝的 HALCON 版本,或是和環境變數 ARCHITECTURE 不相符。 請檢查 ARCHITECTURE 的內容或是重新安裝 HALCON。 hdevelop:Command not found

61

請檢查您的環境變數 PATH,它必須包含下列路徑$HALCONROOT/bin/$ARCHITECTURE lib*:can't open file 這是屬於 UNIX 系統下的問題,請檢查系統變數 LD_LIBRARY_PATH(參考 2.4.2 節) No help file for package<package 名稱> in directory <路徑> 可能原因是 %HALCONROOT%\help\下沒有對應的 help 檔 HALCONROOT 有問題 檢查檔案讀寫保護,有可能 HDevelop 沒有讀取某些檔案的權限。 Help file for package<package-name>is corrupt 如果package名稱是system,可能是HALCONROOT有問題,或是%HALCONROOT%\help\下的檔案版本不符。 如果 package 名稱是使用者自訂的,則可能是因為 help 檔的版本不符。 Can't open display 這類錯誤通常是因為系統變數 DISPLAY 的問題,或是程式不能在 X-server 下開啟視窗。 6.5.5 使用 Pararllel HALCON 的問題 Parallel HALCON 未能提高運算速度 如果在一個多處理器的電腦上 HALCON 未能提高運算速度,則可能是因為您忘了做初始化。

這方面請參考 5.1.1 節。在每一台執行 Parallel HALCON 的電腦上,都要做一次初始化的動

作。如果已完成初始化的動作,可以由運算子 get_system,參數設為 processor_num,來

查看 HALCON 在這台電腦上發現了幾個處理器。這個運算子要在 Parallel HALCON 下來執

行才有意義。 在 Visual Studio 下使用 Parallel HALCON 會比預期的速度還慢 Microsoft 的 Visual Studio 在多處理器的電腦中執行時會對執行緒的排程有重大影響。

HALCON 和 Visual Studio 一起使用時會被拖慢,因此要得到最好的效率,最好是產生一個

獨立的執行檔,並且單獨執行。 某個運算子在 HALCON 和 Parallel HALCON 下的傳回結果不一樣 這可能是因為您的參數中含有 tuple 型態的參數。注意,某些參數不能是 tuple 型態的資料,

甚至於有些運算子不會傳回錯誤訊息。這些參數的限制可以在線上說明或參考手冊中找到,

62

63

可以使用 tuple 型態的參數,會有'(-array)'的標示。 6.5.6 其他問題 在一些 UNIX 系統下預設的視窗特性,像是重疊或是覆蓋時視窗資料的顯示等等,會造成

HALCON 使用上的不便。例如被遮蓋的視窗,它的內容就不會保留,上層視窗移動時,被蓋

住的部分就變成黑色。例如 Linux 的 SuSe 7.0 版。修改的方法是調整視窗的屬性,它的名

稱是 backing-store。 可以輸入下列指令來查看目前設定 xdpyinfo | grep backing-store 得到類似下列的回應 options: backing-store YES,save-unders YES 此外還可以修改 Xservers 這個檔案。它位於/usr/lib/X11/xdm(或是類似的目錄)下,不過您要

有 root 的權限來修改它。在內容中加入 "+bs"(就是加入 backing-store 的意思) :0 local /usr/X11R6/bin/X :0 vt7 +bs 然後中止 X Server 運作,再重新啟動(或是重新開機也可以),此時 xdpyinfo 的傳回結果 應該就和上述相符。