Halcon採集影像Image Acquisition解析

callcall發表於2020-07-08

很明顯,影像的採集是所有機器視覺應用中必須解決的問題,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的網路伺服器下載影像採集介面以及可作為整合基礎的模板原始碼,網址為http://www.mvtec.com/products/interfaces。

相關文章