halcon簡(jiǎn)介
halcon在工業(yè)視覺(jué)中屬于很棒的。
學(xué)習(xí)halcon需要具備 軟件、圖像處理、光學(xué) 三個(gè)部分的知識(shí)。圖像處理一般的套路就是 獲取圖像>分割區(qū)域>特征提取。

halcon文件所在位置:
Users / Shared / Library / Application Support / halcon 13 / example / hdevelop/
我們做項(xiàng)目的圖片路徑就在 example/images/ 里面
一、嵌入式工業(yè)讀碼器
包括DM碼、QR碼、vericode碼

二、 圖像采集的原理,以及準(zhǔn)確成像的專業(yè)方法
1.2 相機(jī)的接口類(lèi)型
USB、IEEE1394、Gigabit Ethernet(千兆網(wǎng))1.3 小試halcon
首先,安裝相機(jī)驅(qū)動(dòng)(一些品牌halcon自帶驅(qū)動(dòng)),比如balser安裝pylon驅(qū)動(dòng),打開(kāi)halcon界面,選擇助手,打開(kāi)新的Image Acquisition,選擇資源,自動(dòng)檢測(cè)接口,然后點(diǎn)擊右邊的按鈕選擇一個(gè)接口,選擇后把選項(xiàng) 資源 切換到 連接,再點(diǎn)擊連接框里面的一個(gè)連接,表示相機(jī)和軟件建立連接,再點(diǎn)擊 實(shí)時(shí),相機(jī)實(shí)時(shí)采集數(shù)據(jù)了。
三、 Blob分析與形態(tài)學(xué)
① Blob
區(qū)域是一種非常重要的概念。
區(qū)域是blobs這一數(shù)據(jù)類(lèi)型在halcon中的一種貼切的表達(dá)形式。
采集圖像-區(qū)域分割,最后通過(guò)特征(如圓度、面積、矩形度等)篩選,這一過(guò)程被稱為Blob(binary large objects)分析。
② 形態(tài)學(xué)
形態(tài)學(xué)是對(duì)區(qū)域大小調(diào)整的一種非常重要的方法和概念。形態(tài)學(xué)包括「開(kāi)運(yùn)算、閉運(yùn)算、腐蝕、膨脹」
形態(tài)學(xué)需要引入一個(gè)新的概念,即結(jié)構(gòu)元素。
- 開(kāi)運(yùn)算可以去除小區(qū)域以及原區(qū)域中突出的細(xì)節(jié)部分;
- 閉運(yùn)算可以填補(bǔ)相鄰區(qū)域以及空洞;
- 腐蝕,會(huì)有一個(gè)結(jié)構(gòu)元素,即一個(gè)形狀的像素組合,以這個(gè)結(jié)構(gòu)元素的中心點(diǎn)像素來(lái)計(jì)算保留處,這個(gè)結(jié)構(gòu)元素在目標(biāo)元素中逐行移動(dòng),若目標(biāo)元素中的形狀和結(jié)構(gòu)元素相同,這個(gè)目標(biāo)元素中對(duì)應(yīng)中心點(diǎn)像素保留。
- 膨脹,與腐蝕相反,即參照一個(gè)結(jié)構(gòu)元素,這個(gè)結(jié)構(gòu)元素我們可以設(shè)定中心點(diǎn),需要膨脹的位置,然后順著圖像一格一格走,只要有和中心點(diǎn)有交集,即可按結(jié)構(gòu)元素膨脹。
開(kāi)運(yùn)算就是先腐蝕再膨脹,閉運(yùn)算就是先膨脹再腐蝕。參考


灰度直方圖。在圖像處理中使用非常頻繁,比如分開(kāi)綠豆和紅豆,可以拍照后選擇灰度,紅色和綠色灰度不同,通過(guò)直方圖選擇灰度范圍,即可選擇出紅豆或綠豆。
-
特征直方圖。比如圓度、面積、
實(shí)戰(zhàn)案例-區(qū)分紅豆和綠豆
-
1.首先打開(kāi)一張圖片,點(diǎn)擊確定,打開(kāi)圖片后,按住command不放,在圖片界面會(huì)出現(xiàn) 當(dāng)前的像素坐標(biāo)和 灰度值
-
2.獲取圖片后,按照套路開(kāi)始圖片分割,我們打開(kāi)灰度直方圖,直接點(diǎn)上方的按鈕,選擇合適的灰度范圍。按照下圖操作完后,點(diǎn)擊單步跳過(guò)函數(shù)
整個(gè)程序的編寫(xiě)和思考如下:
* 1. 采集圖像
read_image (HalconTest01, '/Users/jkx/Desktop/halcon_test01.png')
* 2. 分割圖像
threshold (HalconTest01, Regions, 43, 247) // regions區(qū)域,表示選中43-247中間的灰度
dev_set_draw('margin') // 畫(huà)出邊緣
dev_display(HalconTest01) // 顯示halconTest01這個(gè)圖片,主要是生成 HalconTest01 這個(gè)變量
dev_display(Regions) // 顯示 分割過(guò)的 Regions 圖片,此時(shí)可以看到圖片背景有雜質(zhì),下一步要去除雜質(zhì)
* 3. 采用開(kāi)運(yùn)算,消除圖像雜質(zhì),先構(gòu)建結(jié)構(gòu)元素,結(jié)構(gòu)元素中心點(diǎn)坐標(biāo)我們可以不用管
gen_circle(Circle, 200, 200, 20) // 200,200 是結(jié)構(gòu)元素的坐標(biāo),不管,后面是半徑,根據(jù)你雜質(zhì)的大小選擇,否組雜質(zhì)清不干凈
opening (Regions, Circle, RegionOpening) // 開(kāi)運(yùn)算,表示打開(kāi) Regions這個(gè)對(duì)象,依照結(jié)構(gòu)元素Circle這個(gè)對(duì)象,且生成新的RegionOpening對(duì)象
dev_clear_window()
dev_display(HalconTest01)
dev_display(RegionOpening)
* 4. 分離區(qū)域,將一個(gè)區(qū)域分解成多個(gè)區(qū)域
connection(RegionOpening, ConnectedRegions) //這次分離只分離開(kāi)部分,后面優(yōu)化可以刪掉這條
gen_circle(Circle1, 200, 200, 21.5) // 腐蝕,結(jié)構(gòu)元素更大,確保連在一起的豆子被分割開(kāi),Circle1是對(duì)象
erosion1 (ConnectedRegions, Circle1, RegionErosion, 1) // ConnectedRegions, Circle1, RegionErosion, 1 ,括號(hào)里是函數(shù)的參數(shù),這些參數(shù)是對(duì)象,RegionErosion是新的對(duì)象,halcon的套路是函數(shù)參數(shù)里靠后的是新生成的對(duì)象,輸入、結(jié)構(gòu)元素、輸出
connection (RegionErosion, ConnectedRegions1) // 分離開(kāi)這些豆子
* 5. 再次清屏,為了更好的展示效果
dev_display(HalconTest01)
dev_display(RegionErosion)
* 6. 數(shù)一數(shù)有多少個(gè)被腐蝕后的參數(shù)
count_obj(ConnectedRegions1, Number)
* 7. 膨脹,恢復(fù)原來(lái)的樣子
dilation1 (ConnectedRegions1, Circle1, RegionDilation1, 1)
* 8. 再次清屏,顯示效果,為了便于理解,程序才這么啰嗦,實(shí)際可簡(jiǎn)化
dev_clear_window ()
dev_display (HalconTest01)
dev_display (RegionDilation1)
* 9. 插入特征直方圖,區(qū)分豌豆和綠豆
select_shape (RegionDilation1, SelectedRegions, 'circularity', 'and', 0.571, 0.743)
dev_set_line_width (2)
dev_display (HalconTest01)
dev_display (SelectedRegions) // 和上面的不能倒順序,倒順序就只能顯示Halcon01,不能顯示 SelectedRegions
count_obj (SelectedRegions, Number1) // 數(shù)一下豌豆的數(shù)量
set_tposition (200000, 24, 12) // 設(shè)置顯示文字的位置
write_string (200000, '豌豆的個(gè)數(shù)是:' + Number1) // 顯示的內(nèi)容
* dev_clear_window ()
* dev_display (HalconTest01)
difference (RegionDilation1, SelectedRegions, RegionDifference) // 差值運(yùn)算,這里小錯(cuò)誤,雖然差值了,很多元素看不見(jiàn)了,但是還存在,所以結(jié)果還是67,需要再次處理
select_shape (RegionDifference, SelectedRegions1, 'area', 'and', 855, 4895)
count_obj (SelectedRegions1, Number2)
set_tposition (200000, 24, 12)
new_line (200000)
write_string (200000, '綠豆的個(gè)數(shù)是:' + Number2) // 顯示綠豆數(shù)
③ 顏色空間
主要分為以下幾點(diǎn):Halcon支持的顏色空間、通道與顏色空間的轉(zhuǎn)化、通道與區(qū)域分割方法、案例講解
一般來(lái)說(shuō),我們得到一幅圖像可以拆分為RGB(紅黃藍(lán)三通道分量交織,按BGRB排序)隨后我們可以由RGB得到HSV空間圖像。
而且,通道圖像和 顏色空間圖像 都是 8bit 灰度圖像。
色調(diào) H
用角度來(lái)度量,取值為 0~360度,從紅色開(kāi)始逆時(shí)針計(jì)算,紅色為0,綠色為120,藍(lán)色為240,它們的補(bǔ)色黃色為60,青色180,品紅300.飽和度 S
飽和度表示顏色接近光譜的程度,一種顏色可以看出光譜色和白色混合的結(jié)果,其中光譜色越大,飽和度越高,顏色越艷麗,類(lèi)似油畫(huà)里的白礬,顏色加上白礬,它的保護(hù)度就降低了。明度 V
明度表示顏色的 明亮程度,對(duì)于光源色,明度值取決于發(fā)光體的光亮度,對(duì)于物色體,此值和物體的折射比和反射比相關(guān),一般取值從0%(黑)到100%(白)。
四、 幾何定位+仿射變換+視覺(jué)測(cè)量
定位三方法:Blob定位、模板匹配、深度學(xué)習(xí)
仿射變換:就是一種特殊的幾何變換,是一種投影,常見(jiàn)的有 旋轉(zhuǎn)、平移、縮放 (就是矩陣間的運(yùn)算)
Blob分析 模板匹配
五、MPL深度學(xué)習(xí)(多層神經(jīng)網(wǎng)絡(luò))
比如對(duì)于不同的物品,A、B、C,我們可以通過(guò)紋理區(qū)分ABC,得出3個(gè)不同的值,再比如我們 通過(guò)周長(zhǎng)區(qū)分ABC,又得出3個(gè)不同的值,那邊把這些特征集合在一起構(gòu)成特征向量, 不同物品的特征向量值不一樣,可以劃分出ABC,這個(gè)劃分的過(guò)程就是靠分類(lèi)器完成的,而訓(xùn)練的過(guò)程就是根據(jù) 特征向量的不同,把他們訓(xùn)練成某類(lèi)物品并歸類(lèi)分類(lèi)。
MPL:Multi-Layer Perceptron
halcon視覺(jué)總結(jié)
一般來(lái)說(shuō),對(duì)于2D項(xiàng)目,無(wú)外乎這樣的套路:
- 圖像采集
- 預(yù)處理,主要有兩種方法,
對(duì)比度和去噪
- 預(yù)處理,主要有兩種方法,
對(duì)比度:
scale_image (灰度縮放算子,在灰度直方圖里操作,線性拉伸灰度)
emphsize (增強(qiáng)算子)
grey_range_rect (增加灰度動(dòng)態(tài)范圍的算子)
equ_histo_image (直方圖均勻化,讓圖片灰度分布更均勻)
去燥:
mean_image (均值濾波)、高斯濾波、中值濾波
- 圖像分割
二值化、形狀選擇、形態(tài)學(xué)
- 圖像分割
- 特征識(shí)別 和 求取計(jì)算
- 顯示與通訊
halcon中涉及的圖像處理十大理論知識(shí)
- 圖像處理基礎(chǔ)知識(shí)
- 圖像的灰度變換
- 圖像增強(qiáng)(預(yù)處理:增強(qiáng)對(duì)比度 和去噪(均值、中值、高斯濾波))
- 圖像的幾何變換(仿射變換、投影變換、極坐標(biāo)變換等)
- 圖像分割(邊緣提取、Blob分析等)
- 圖像的頻域(缺陷劃痕檢測(cè)等)
- 圖像的形態(tài)學(xué)(膨脹、腐蝕、開(kāi)運(yùn)算、閉運(yùn)算等)
- 圖像的復(fù)原(這點(diǎn)halcon涉及不多,主要是刑偵用)
- 運(yùn)動(dòng)圖像(運(yùn)動(dòng)檢測(cè),差分、光流法)
- 圖像配準(zhǔn)(模板匹配等)
六、硬件知識(shí)
購(gòu)買(mǎi)工業(yè)相機(jī)必須要知道的參數(shù)
- 分辨率(Resolution):相機(jī)每次采集圖像的像素點(diǎn)數(shù)。對(duì)于數(shù)字工業(yè)相機(jī)一般是直接與光電傳感器的像元數(shù)對(duì)應(yīng)的,對(duì)于模擬相機(jī)則是取決于視頻制式,PAL制為768576,NTSC制為640480。
- 像素深度(Pixel Depth):即每像素?cái)?shù)據(jù)的位數(shù),一般常用的是8Bit.例如,一幅彩色圖像的每個(gè)像素用R,G,B三個(gè)分量表示,若每個(gè)分量用8位,那么一個(gè)像素共用24位表示,就說(shuō)像素的深度為24,每個(gè)像素可以是16 777 216(2的24次方)種顏色中的一種。在這個(gè)意義上,往往把像素深度說(shuō)成是圖像深度。表示一個(gè)像素的位數(shù)越多,它能表達(dá)的顏色數(shù)目就越多,而它的深度就越深。
- 最大幀率(Frame Rate)/行頻(Line Rate):即相機(jī)采集傳輸圖像的速率,對(duì)于面陣相機(jī)一般為每秒采集的幀數(shù),對(duì)于線陣相機(jī)為每秒采集的行數(shù)。
- 曝光方式(Exposure)和快門(mén)速度(Shutter):對(duì)于線陣相機(jī)都是逐行曝光的方式,可以選擇固定行頻和外觸發(fā)同步的采集方式,曝光時(shí)間可以與行周期一致,也可以設(shè)定一個(gè)固定的時(shí)間;面陣工業(yè)相機(jī)有幀曝光、場(chǎng)曝光和滾動(dòng)行曝光等幾種常見(jiàn)方式。數(shù)字工業(yè)相機(jī)一般都提供外觸發(fā)采圖的功能,快門(mén)速度一般可到10微秒,高速工業(yè)相機(jī)還可以更快。
- 像元尺寸(Pixel Size):像元大小和像元數(shù)共同決定了相機(jī)靶面的大小。目前數(shù)字工業(yè)相機(jī)像元尺寸一般為3-10μm,一般像元尺寸越小,制造難度越大,圖像質(zhì)量也越不容易提高。
- 光譜響應(yīng)特性(Spectral Range):指該像元傳感器對(duì)不同光波的敏感特性,一般響應(yīng)范圍是350-1000nm,一些相機(jī)在靶面前加了一個(gè)濾鏡,濾除紅外光線,如果系統(tǒng)需要對(duì)紅外感光時(shí)可去掉該濾鏡。
打光和鏡頭
《工程光學(xué)》 打光、選型、鏡頭
附錄:以上是工業(yè)上的,其實(shí)在顯微鏡等超高精度的視覺(jué)中,除了要考慮相機(jī)圖像分辨率,還要考慮 光學(xué)系統(tǒng)分辨率,這里一般精度在 nm 級(jí)別,可 參考文章
與公司算法工程師的交流:
問(wèn):卷積在圖像算法中能干嘛?
答:可以用來(lái)濾波,也可以來(lái)模板匹配問(wèn):圖像中 均值濾波、高斯濾波、中值濾波,這些感冒?
答:去噪聲。比如中值濾波可以去椒鹽噪聲, 自然界的噪聲高斯噪聲多,用高斯濾波去除,等等。補(bǔ)充:頻域高通濾波銳化圖像,即圖像中的邊界輪廓越明顯,丟失了信息豐富的低頻部分;頻域低通濾波平滑圖像,即圖像中輪廓被淡化。問(wèn):卷積是對(duì)圖片進(jìn)行平滑處理嗎?
答:卷積可以理解為一種方法、一種操作,卷積就是按照塊滑動(dòng)處理,比如去一些圖像毛刺。Halcon中的 開(kāi)運(yùn)算、閉運(yùn)算、膨脹、收縮、也可以理解 為一種卷積。問(wèn):傅里葉變換在圖像中的意義是?
答:傅里葉變換用途很大,比如有時(shí)候噪聲很難再時(shí)域中去除,在頻域中 很好去除,另外,傅里葉可以用來(lái)壓縮圖像,圖像打包后變成頻域,解壓再變成時(shí)域。-
涉及具體數(shù)學(xué),傅里葉到底對(duì)圖片做什么?
答:圖片其實(shí)可以理解為三維空間 圖,xy 為空間位置,z為灰度值,通過(guò)傅里葉變換后,新的三維空間圖像 xy 為不同方向的頻率,z為幅值(待定)
圖像的頻率是表征圖像中灰度變化劇烈程度的指標(biāo),是灰度在平面空間上的梯
度
這就得出了一個(gè)結(jié)論:傅里葉變換后的白色部分(即幅度較大的低頻部分),表示的是圖像中慢變化的特性,或者說(shuō)是灰度變化緩慢的特性(低頻部分)。
傅里葉變換后的黑色部分(即幅度低的高頻部分),表示圖像中快變化的特性,或者說(shuō)是灰度變化快的特性(高頻部分)。



