《HALCON機器視覺與算法原理編程實踐》第4章軟件圖像採集-學習筆記

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的圖像採集步驟

  1. 開啓圖像採集接口
  2. 讀取圖像
  3. 關閉圖像採集接口

4.2.2 使用Halcon接口連接相機

  1. 選擇工業相機
    在這裏插入圖片描述
  2. 插入代碼
    在這裏插入圖片描述
* 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)
  1. 獲取圖像
    在這裏插入圖片描述

4.2.3 使用相機的SDK採集圖像

4.2.4 外部觸發採集圖像

4.3 多相機採集圖像

  1. 連接多個採集設備
  2. 多相機異步採集圖像
  3. 多相機同步採集圖像

4.4 Halcon圖像的基本結構

  1. Image:指Halcon的圖像類型
  2. Region:指圖像中的一塊區域
  3. XLD:指圖像中某一塊區域的輪廓
  4. Tuple:類似於數組,可用於存儲一幅或多幅圖像

4.5 實例:採集Halcon圖像並進行簡單處理

  1. 撕幾個小紙片擺好
    在這裏插入圖片描述
  2. 找出這幾個小紙片
* 關閉當前窗口,清空屏幕
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)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章