文章目錄
4.1 獲取非實時圖像
方法一:通過代碼讀取圖像文件
* 讀取單個文件
read_image (Image1, 'E:/Project/Halcon_Project/test/橫條.jpg')
read_image (Image2, 'E:/Project/Halcon_Project/test/豎條.jpg')
* 遍歷文件夾E:/Project/Halcon_Project/test/下包括子文件夾所有文件
list_files ('E:/Project/Halcon_Project/test/', ['files','follow_links'], ImageFiles)
* 篩選bmp或jpg或png文件
tuple_regexp_select (ImageFiles, ['\\.(bmp|jpg|png)$','ignore_case'], ImageFiles)
* 循環讀取文件夾的圖像
for Index := 0 to |ImageFiles|-1 by 1
read_image (Image3, ImageFiles[Index])
endfor
方法二:通過Halcon圖像採集助手讀取文件
4.1.2 讀取視頻文件
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('DirectShow', 1, 1, 0, 0, 0, 0, 'default', 8, 'rgb', -1, 'false', 'default', '[0] Altair USB2.0 Camera', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
while (true)
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
endwhile
close_framegrabber (AcqHandle)
4.2 獲取實時圖像
參考我另外一篇博客連接好工業相機:
海康威視MV-CA060-11 GM工業相機首次安裝與MVS客戶端操作
4.2.1 Halcon的圖像採集步驟
- 開啓圖像採集接口
- 讀取圖像
- 關閉圖像採集接口
4.2.2 使用Halcon接口連接相機
- 選擇工業相機
- 插入代碼
* Image Acquisition 01: Code generated by Image Acquisition 01
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'c42f90f77f12_Hikvision_MVCA06011GM', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
grab_image_async (Image, AcqHandle, -1)
* Image Acquisition 01: Do something
close_framegrabber (AcqHandle)
- 獲取圖像
4.2.3 使用相機的SDK採集圖像
4.2.4 外部觸發採集圖像
4.3 多相機採集圖像
- 連接多個採集設備
- 多相機異步採集圖像
- 多相機同步採集圖像
4.4 Halcon圖像的基本結構
- Image:指Halcon的圖像類型
- Region:指圖像中的一塊區域
- XLD:指圖像中某一塊區域的輪廓
- Tuple:類似於數組,可用於存儲一幅或多幅圖像
4.5 實例:採集Halcon圖像並進行簡單處理
- 撕幾個小紙片擺好
- 找出這幾個小紙片
* 關閉當前窗口,清空屏幕
dev_close_window ()
* 打開圖像採集接口,這裏用的是網線,其它默認
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive', -1, 'default', -1, 'false', 'default', 'c42f90f77f12_Hikvision_MVCA06011GM', 0, -1, AcqHandle)
* 抓取一幅圖像大小,這幅圖是爲了獲取圖像的大小以建立合適尺寸的窗口
grab_image (Image, AcqHandle)
* 獲取圖像的大小,以建立合適尺寸的窗口
get_image_size (Image, Width, Height)
* 創建新的顯示窗口
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
* 開始進入採集圖像的循環
while (true)
* 利用次採集接口的句柄獲取圖像
grab_image (Image, AcqHandle)
* 顯示圖像採集畫面
dev_display (Image)
**
* 此處可根據需要對圖像做進一步處理。這裏舉一個簡單的閾值處理並計數的例子
**
* 將圖像轉換爲單通道灰度圖像
rgb1_to_gray (Image, GrayImage)
dev_display (GrayImage)
* 使用閾值處理提取較亮部分
threshold (GrayImage, Region, 239, 255)
* 填充區域
fill_up (Region, RegionFillUp)
* 將不相連的區域整體分割成獨立的區域
connection (RegionFillUp, ConnectedRegions)
* 排除雜點,將面積較大的目標選擇出來
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 70, 99999)
* 目標計數
count_obj (SelectedRegions, Number)
* 即將顯示文字,文字顏色設置爲紅色
dev_set_color ('red')
* 確定文字的顯示位置
set_tposition (WindowHandle, 10, 10)
* 查詢系統字體
query_font (WindowHandle, Font)
* 設置字體
* set_font(WindowHandle, Font[0])
* 窗口輸出文字
write_string (WindowHandle, '有'+Number+'個零件')
* 顯示零件形狀區域,設置顏色爲紅色
dev_set_color ('red')
* 顯示模式爲填充
dev_set_draw ('fill')
* 顯示提取出的區域
dev_display (Region)
endwhile
* 採集結束,關閉採集接口,釋放相機資源
close_framegrabber (AcqHandle)