halcon視覺入門掃盲篇


halcon視覺入門掃盲篇

前言
    在公司讓我研究視覺的時候,我是兩眼一抹黑的。之前完全沒有接觸過視覺。綜合權衡后選擇了Halcon,使用的是HDevelop 13 (64-bit)。

    下載地址 官方下載

    破解有點麻煩,我使用的是文件替換破解。一個exe文件一個dll文件,替換即可。

假設以上環境搭建沒有問題,現在開始了解視覺識別的套路

基礎知識

既然是做視覺,就需要圖像,不管這個圖像是從攝像頭讀過來的還是從文件中讀取的。圖片有一些基礎信息,比如:

通道:一張圖片一般有3個通道,也就是R G B 三個通道,R 代表紅色 G 代表綠色 B 代表藍色。

像素:計算機存儲每個圖片有N多個像素點,我們常說某個相機有幾百萬像素,說的就是這個,像素在計算機存儲層面不可分割,是最小粒子。但在視覺算法上是可以的(后面再說)。

灰度值:灰度也可以認為是亮度,也是黑白圖像中點的顏色深度,范圍一般從0到255,白色為255 ,黑色為0,故黑白圖片也稱灰度圖像。(如此簡單理解即可)

Region:區域,根據特征提取出來的一些范圍。

算子:直接理解成方法。

知道這些基礎知識以后,我們在來理解什么是視覺識別。也別去看百度百科了,簡單的理解就是,通過提取圖像中的特征,選取我們需要的區域,從而達到一定的目的。

比如,有如下圖
image
需要識別每個方格中是否有芯片。這是一個需求。根據這個需求,我們來進行需求拆解:

1. 如何在這張圖里面得到這些方格。

2. 如何在每個方格中判斷芯片是否存在。

大體思路就是這樣了,接下來對圖像進行分析,得到具體解決問題的思路:

如何在這張圖里面得到這些方格。

分析圖像可以知道:

  1. 方格是白色的,亮度較高。但白色的內容不只有方格,所以在提取特征的時候,需要注意。

  2. 方格比較規整,都是方形,面積相似。

  3. 方格與方格相連,所在的區域在整個圖像的中心位置。

以上就是分析圖像得到的信息。這些信息就是方格的特征,我們通過特征進行篩選,從而得到所有的方格。

如何判斷方格中是否存在芯片

此時我們的興趣點就在每個方格中,所以分析每個方格,我們可以得出一下結論:

  1. 芯片面積大小都差不多。

  2. 因為光照不均勻,導致有些地方的芯片亮度較高,有些亮度比較低,這可能是我們識別芯片過程中的難點。

  3. 芯片都是矩形。

  4. 有些芯片跟白色方格線比較近,可能會給我們識別芯片帶來干擾。

  5. 芯片顏色灰度跟方格中的背景色不一致。

  6. 如果方格中沒有芯片,那么方格中沒有上述特征。

以上是特征分析,和解決問題的思路,接下來是編程的套路。

視覺分析的編程套路一般如下幾個步驟:

  1. 打開圖片(OpenImage)
  2. 將圖片分解成3通道圖片,或是轉成灰度圖(GrayImage)。
  3. 二值化或動態二值化(Region)。
  4. 聯通區域。
  5. 特征篩選。
  6. 如果區域有干擾,一般會進行一下操作:
    1. 腐蝕
    2. 膨脹
    3. 形狀轉換
    4. 以上步驟重復,或組合重復。
  7. 根據需要,還可以合並區域,並重復4-6,從而達到目的。
  8. 輸出區域並標注。

實則還有其他的處理方式,比如我們需要的區域特征不明顯,不需要的區域特征很明顯,此時,我們可以獲取不需要的區域,然后使用相減的方式得到需要的區域。(這個會在實際的使用中講到)

接下來進行答疑

我在學習的過程中,產生了很多疑問,直到我反復編程理解后才明白為什么要這么做。在這里,我會先給出答案。

Q:為什么需要將圖片分解成3通道圖片,或是灰度圖?

A:我的理解是,因為如果不分解,圖片是RGB三通道圖片,那么程序就不知道對哪個通道進行操作。將圖片轉換為灰度圖或是單通道后,我們才能根據圖片的明暗,也就是灰度,進行特征提取。

Q:什么是二值化?

A:二值化通俗的講就是通過兩個灰度值來分割出感興趣的區域。比如,我需要的區域很亮,我查看特征后發現,這個區域的亮度范圍在 210-255之間。此時我就可以通過 threshold 算子,如: threshold(Image, Region, 210, 255) 來得到我們感興趣的區域 Region。這里 Image是輸入參數,210是控制參數,255是控制參數,Region是輸出參數。

Q:什么是聯通區域?

A:聯通區域實際上是一個算子 connection,是這樣調用的:connection (Region, ConnectedRegions) ,實際上我們通過二值化得到的區域不一定就完全是我們需要的內容,可能會存在干擾。也就是說,會有很多個區域存在,但這些區域在沒有執行 connection之前是一個整體,我們只有在對他進行聯通之后,才會被分割成多個對象。此時,我們就可以通過,面積,長寬,矩形相似度等特征進行進一步篩選。總的說回來,connection這個算子雖然說是聯通區域,但實際上是將區域分割成多個部分。

Q:什么是特征篩選?

A:特征篩選是通過面積,長寬,矩形相似度,灰度值等條件,將我們需要的內容篩選出來。

Q:什么是腐蝕?

A:腐蝕的前提是我們要的比實際的結果要小,所以需要對目標區域進行腐蝕,讓它變小。

Q:什么是膨脹?

A:膨脹跟腐蝕正好相反,因為我們要的比較大,但目標區域比較小,所以我們需要讓它變大。

Q:什么是形狀轉換?

A:將目標區域轉化為特定的形狀,比如得到的區域是一個不規則的矩形,我們可以作外接矩形或是外接圓,讓它更符合實際結果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM