Halcon採集影像Image Acquisition解析

很明顯,影像的採集是所有機器視覺應用中必須解決的問題,HALCON提供了為各種影像採集設備執行這種交互的介面,影像採集的任務被簡化為幾行程式碼,只需幾個操作符的調用,更重要的是,這種簡單並不是以限制可用功能為代價。使用HALCON,可以在不同的時間模式下從不同的採集設備和相機中獲取影像。除了從相機中獲取影像外,HALCON還可以將存儲在文件中的影像顯示出來(支援的文件格式:BMP、TIFF、GIF、JPEG、PNG、PNM、PCX、XWD)。

基本概念

用HALCON獲取影像基本上只需要三個步驟,而從文件中讀取影像則更為簡單:只需調用read_image操作符即可。

打開影像採集設備

如果想從一個攝像機中獲取影像,第一步就是要連接到這個設備。HALCON可以解決所有與設備相關的細節問題;只需要調用運算元 open_framegrabber,指定相應的影像採集介面名稱。

還有一個 “虛擬 “的影像採集介面叫File。顧名思義,這個 “抓幀器 “讀取文件中的影像,以及所謂的影像序列文件。後者是Halcon特有的文件類型,典型的擴展名是.seq,它們包含一個影像文件名的列表,用新的行隔開(可以用文本編輯器很容易地創建它),如果你鏈接到這樣的序列,隨後調用grab_image就會返迴文件中指定的序列影像。 然後,不必創建一個序列文件,而只需指定目錄名稱而不是序列文件作為參數’CameraType’的值。後續調用grab_image會返回在指定的影像目錄中找到的影像。如果想用影像文件序列或者在真實的影像採集設備上來測試應用程式,那麼以上這兩種方法都很有用。

獲取影像

連接到設備後,只需調用grab_image就可以獲取影像。
要從磁碟中載入影像,需要使用read_image,影像會在當前目錄中和當前設備環境變數HALCONIMAGES指定的目錄中被搜索到。

關閉影像採集設備

在應用程式結束時,可以使用運算符close_framegrabber關閉與影像採集設備的連接以釋放其資源。

例子

如前所述,從文件中獲取影像調用對應的一個運算符:

read_image(Image,'particle')

下面的程式碼處理從影像序列中讀取的影像:

SequenceName:='pendulum/pendulum.seq'
open_framegrabber('File',-1,-1,-1,-1,-1,-1,'default',-1,'default',-1,'default',SequenceName,'default',-1,-1,AcqHandle)
while(ImageNum<=MaxImageNum)
	grab_image(Image,AcqHandle)
	...處理影像...
	ImageNum := ImageNum+1
endwhile

擴展概念

在實際應用中,通常不需要讓攝像機來獲取影像,而重要的是在正確的時刻或速率下獲取影像,並且攝像機和影像採集介面都要有合適的參數。因此,HALCON允許進一步參數化採集過程。在HDevelop中,通過菜單項Assistants>Image Acquisition提供了一個助手,它可以幫助選擇影像源,調整參數,並生成合適的程式碼。

打開影像採集設備

當用open_framegrabber連接到影像採集設備時,主要參數是對應的HALCON影像採集介面的名稱,因此,會得到一個所謂的handle,可以用它來訪問該設備,例如,用grab_image或grab_image_async來採集影像。

通過open_framegrabber的其他參數,可以描述影像採集設備和攝像機的配置,在這裡使用更多完整的配置時是必要的,例如,多個攝像機連接到不同的採集卡的不同埠。更多的參數允許指定所需的影像格式(尺寸,解析度,像素類型,顏色空間)。這些參數中大多數都有默認值,如果想使用這些參數,可以使用指定 “default”(字元串參數)或 -1(數字參數)。

通過運算元info_framegrabber,可以查詢介面的版本號、可用的板卡、埠號和攝像機類型等資訊。

設置參數

如上所述,在連接到影像採集設備時,已經設置了一些參數,如open_framegrabber。這些參數(影像採集設備/攝像機的配置和影像大小等)是所謂的通用參數,因為它們幾乎是所有影像採集介面所共有的。然而,影像採集設備在所提供的功能上有很大的不同,導致了有更多的特殊參數。這些參數可以通過運算元set_framegrabber_param進行自定義。
通過運算元get_framegrabber_param,可以查詢普通參數和特殊參數的當前值。

採集影像

實際上,在實際機器視覺應用中,不會使用運算元grab_image來獲取影像,而是使用grab_image_async。這兩個操作符的區別如下。如果在循環中獲取和處理影像 grab_image總是請求獲取一個新的影像,然後暫停程式,直到獲取完成。然後,對影像進行處理,之後,程式等待下一張影像。相反,當使用 grab_image_async 時,影像的採集和處理是並行的。當一幅影像 處理完畢,下一張影像已經在採集中,大大加快了應用程式在處理影像的速度。
HALCON提供了更多的影像採集模式,例如,通過外部訊號觸發採集或從多台相機同時採集影像(現實場景中經常用到)。有興趣的話可以了解一下。

涉及運算元

打開影像採集設備

基礎:open_framegrabber

高級:info_framegrabber

設置參數

基礎:set_framegrabber_param, get_framegrabber_param

採集影像

基礎:read_image, grab_image, grab_image_async

打開影像採集設備

基礎:close_framegrabber

進階

直接訪問記憶體中的外部影像

還可以將外部創建的影像(即電腦記憶體中的原始影像矩陣)傳遞給HALCON。
使用操作符gen_image1、gen_image3、gen_image1_extern或gen_image3_extern。

不支援的影像採集設備

如果想使用 HALCON 目前不支援的影像採集設備,也就是說,HALCON不支援的設備,可以創建自己的介面。創建和使用HALCON介面方法可從MVTec的網路伺服器下載影像採集介面以及可作為集成基礎的模板源程式碼,網址為//www.mvtec.com/products/interfaces。