halcon影象採集
阿新 • • 發佈:2019-02-01
影象獲取程式例1.
1.set_system( : : SystemParameter, Value : )
設定系統引數
2.open_framegrabber ( : : Name, HorizontalResolution,VerticalResolution, ImageWidth, ImageHeight, StartRow, StartColumn,Field, BitsPerChannel, ColorSpace, Generic, ExternalTrigger,CameraType, Device, Port, LineIn : AcqHandle )
開啟並配置影象採集裝置
輸入控制:
Name:影象採集裝置的名稱
HorizontalResolution和VerticalResolution:預期的影象採集介面的水平解析度和垂直解析度
ImageWidth和ImageHeight:指預期影象的寬度部分和高度部分。
StartRow和StartColumn:指顯示預期影象的開始座標
Field:預期影象是一半的影象或者是完整影象
BitsPerChannel:每畫素位元數和影象通道
ColorSpace:獲取影象的輸出形式{gray、raw、rgb、yuv、default}
Generic:通用引數與裝置細節部分的具體意義。
ExternalTrigger:是否有外部觸發
CameraType:使用相機的型別
Device:影象獲取設別連線到的裝置
Port:影象獲取設別連線到的埠
LineIn :相機輸入的多路轉接器
AcqHandle:影象獲取裝置的Handle
3.grab_image( : Image : AcqHandle : )
從AcqHandle指定的影象獲取裝置中獲取影象,輸出為獲得的影象
4.set_framegrabber_param( : : AcqHandle, Param, Value : )
為AcqHandle指定的影象獲取裝置設定引數
Param : 'color_space', 'continuous_grabbing', 'external_trigger', 'grab_timeout', 'image_height', 'image_width', 'port', 'start_column', 'start_row', 'volatile'
注意:能夠設定的引數不僅僅是上述建議的引數。也可以一次設定多個引數值。
例如:set_framegrabber_param (AcqHandle, 'port', Port0)
set_framegrabber_param (AcqHandle, ['image_width','image_height'], [256, \256])
對DaHengCams能設定的常用額外引數包括:
'adc_level' ---設定A/D轉換的級別;
'color_space' ---設定顏色空間
'gain' ---設定相機增益
'grab_timeout' ---設定採集超時終止的時間
'resolution' ---設定相機的採相解析度,MOD0為最大的解析度。
'shutter' ---設定相機的曝光時間。
'shutter_unit' ---設定相機曝光時間的單位。
'white_balance' ---相機是否開啟白平衡模式,預設為關閉白平衡
5.info_framegrabber( : : Name, Query : Information, ValueList)
查詢指定的影象採集介面的資訊。
Name為影象採集裝置的名稱
Query為需要查詢的引數名稱
Information是指輸出的文字資訊
ValueList為該影象採集介面的引數值
6.get_image_pointer1(Image : : : Pointer, Type, Width, Height)
獲取一個影象通道的指標,輸出指標以及影象型別和尺寸。
7.dev_set_part( : : Row1, Column1, Row2, Column2 : )
修改影象顯示部分的尺寸。
8.close_all_framegrabbers( : : : )
關閉影象採集裝置。
9.count_seconds( : : : Seconds)
測試運算元實行時間
* general configuration of HDevelop
set_system ('do_low_error', 'true') //設定系統引數,在輸出視窗隻立即顯示影象//
dev_update_window ('off')
stop ()
* step 1: connect to the image acquisition device
* -> Please adapt the following lines for your own image acquisition device.
AcqName := 'DaHengCam'
open_framegrabber (AcqName, 1, 1, 0, 0, 0, 0, 'default', -1, 'gray', -1, 'false', 'ntsc', 'default', -1, -1, AcqHandle) //開啟並配置影象採集裝置//
stop ()
* step 2: grab a first image and adjust the window size
grab_image (Image, AcqHandle) //獲取影象//
get_image_pointer1 (Image, Pointer, Type, Width, Height) //獲取影象通道指標//
dev_close_window ()
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle) //開新視窗//
dev_set_part (0, 0, Height-1, Width-1)
dev_display (Image)
stop ()
* step 3: grab and process images in a loop (exit with left mouse button)
dev_open_window (0, Width/2 + 8, Width/2, Height/2, 'black', WindowHandleProcess)
dev_set_colored (12)
dev_open_window (Height/2 + 68, 0, Width/2, Height/16, 'light gray', WindowHandleButton)
dev_set_part (0, 0, Height/16 - 1, Width/2 -1)
write_string (WindowHandleButton, ' click here with left mouse button to exit loop')//寫字元
進入視窗//
dev_set_window (WindowHandle)
dev_set_part (0, 0, Height-1, Width-1)
Button := 0
while (Button # 1)
grab_image (Image, AcqHandle)
dev_set_window (WindowHandle)
dev_display (Image)
* -> process image (segment with an automatically determined threshold)
auto_threshold (Image, Regions, 4)//高斯平滑影象並利用直方圖分割影象輸出區域//
connection (Regions, ConnectedRegions)2.Insert : 對陣列中的某一個值進行賦值。
Tuple1 := [1,0,3,4,5,6,7,8,9]
Tuple1[3]:=2
顯示結果為:[1, 0, 3, 2, 5, 6, 7, 8, 9],即對索引3後面元素,陣列Tuple1中第4個元素賦值2.
example:
read_image (Mreut, 'mreut') //讀入影象
threshold (Mreut, Region, 190, 255) //閾值化,輸出閾值在190-255的Regions
Areas := [] //定義陣列Areas
for Radius := 1 to 50 by 1 //迴圈
dilation_circle (Region, RegionDilation, Radius) //利用半徑為Radius的圓對Region進行膨脹運算,輸出
RegionDilation,輸出形式仍然為Region。
area_center (RegionDilation, Area, Row, Column) //輸出區域的面積和中心畫素座標
Areas[Radius-1] := Area //對陣列Areas的第Radius-1個元素進行賦值
endfor
3.基本陣列操作極其對應的運算元
t := [t1,t2] t1,t2連線成新的陣列 對應運算元:tuple_concat
i := |t| 得到陣列長度 tuple_length
v := t[i] 選取第i個元素0<= i < |t| tuple_select
t := t[i1:i2] 選取i1到i1的元素 tuple_select_range
t := subset(t,i) 選取陣列t中的第i個元素 tuple_select
t := remove(t,i) 去除陣列t中的第i個元素 tuple_remove
i := find(t1,t2) 找到t2陣列在t1陣列中出現位置索引
(or -1 if no match) tuple_find
t := uniq(t) 在t陣列中把連續相同的值只保留一個 tuple_uniq
4.建立陣列
(1)gen_tuple_const函式
tuple := gen_tuple_const(100,4711) //建立一個具有100個元素的,每個元素都為4711的資料
tuple_new := gen_tuple_const(|tuple_old|,4711) //建立一個和原來資料長度一樣的資料
上面的函式也可以通過如下表達式實現:tuple_new := (tuple_old * 0) + 4711
(2)當陣列中的元素不同時,需要用迴圈語句對陣列中的每一個元素賦值
例如:tuple := [] //建立空陣列
for i := 1 to 100 by 1 //建立步長為1的迴圈
tuple := [tuple,i*i] //將i方的值賦給陣列的第i個元素
endfor //迴圈結束
dev_set_window (WindowHandleProcess)
dev_display (ConnectedRegions)
* -> check for a click into the window (error handling switched off, otherwise the cursor must always be in the window)
dev_set_check ('~give_error')
get_mposition (WindowHandleButton, Row, Column, Button)
dev_set_check ('give_error')
endwhile
dev_set_window (WindowHandleButton)
dev_close_window ()
dev_set_window (WindowHandleProcess)
dev_close_window ()
stop ()
* clean up
dev_update_window ('on')
close_all_framegrabbers ()