課題需要對影象中的缺陷進行尺寸評價,開發環境是halcon。
選擇使用最小外接矩形方法,原因主要是
可獲得的評價引數多:長度,寬度,角度,長寬比,面積
通過長寬比引數可以判定缺陷形狀
獲取最小外接矩形的過程:
這裡是做測試的原圖
影象分割
選取合適的閾值比較困難。考慮到是工廠環境,採光可能不均勻,也為了測試方便(主要使用手機拍照,光源是環境光和手機閃光燈), 採用動態閾值分割法,halcon提供了乙個函式:
dyn_threshold(origimage, thresholdimage : regiondynthresh : offset,這裡有個問題,什麼是包含本地閾值的?這裡可以使用乙個函式,先獲取一張經過平均閾值處理的。lightdark : )
mean_image(image : imagemean : maskwidth, maskheight : )大概思路是使用高斯濾波,將每幾個點的灰度值聯絡起來,取其平均值,比如在下圖中,中間位置的灰度值取決於相鄰八個點的灰度值,這樣對影象中每個點進行處理,最終可以得到一張經過平滑處理的影象。
這裡是經過均值濾波之後的影象
現在我們可以感性理解一下dyn_threshold這個函式:通過對比原圖和區域性臨域之間的灰度值差,對每個區域性小塊獲取乙個區域性的閾值,這樣下來,對於區域性灰度差異值大的影象來說可以很好地完成分割。
這裡是經過動態閾值分割之後的影象
獲取最小外接矩形
其實halcon已經將這種非常常用的處理演算法打包,直接呼叫函式:
如果獲得了多個最小外接矩形怎麼辦?
在我本次的例子中雖然很順利的生成了唯一的最小外接矩形,但是在大多數閾值分割不夠完善的影象中,很容易生成多個最小外接矩形。這個時候就要考慮重新選擇閾值分割的引數。
我們獲取到的尺寸是物體的實際尺寸嗎?
很遺憾,到了這一步我們並沒有得到物體的實際尺寸,因為在影象中沒有任何乙個已知尺寸的條件下,我們無法得到真實尺寸。這裡得到的數值實際上是影象中的畫素值,畫素值可以通過dpi換算成尺寸,但是這個尺寸僅僅指的是在1:1列印後的尺寸,我們需要在中畫下乙個標尺,通過換算得到實際尺寸。
在我的課題中,有一部分是測量系統的硬體設計,鏡頭到物體的距離將是乙個固定值,所以我可以在硬體確定後通過測試得到乙個轉換公式,以此獲得實際尺寸。
dev_close_window()
dpi:=72
*這裡做出說明,dpi是根據相機變化的引數,需要自行調整
read_image (image, 'd:/畢業設計/image/40x40.jpg')
get_image_size(image, width, height)
dev_open_window(0, 0, width/4, height/4, 'black', windowhandle)
mean_image (image, imagemean, 101, 101)
dyn_threshold (image, imagemean, region, 1, 'dark')
*使用動態閾值分割影象
connection(region, connectedregions)
*合併畫素相連區成為乙個element
select_shape (connectedregions, selectedregions, 'height', 'or', 1000, 100000)
*selectedregions:=region
*選擇具有特定特徵的區域
smallest_rectangle2(selectedregions, row, column, phi, length1, length2)
tuple_max(length1,maxlength1)
for index := 0 to |length1|-1 by 1
if(length1[index]==maxlength1)
maxlength2:=length2[index]
maxrow:=row[index]
maxcolumn:=column[index]
maxphi:=phi[index]
endif
endfor
//將最大的最小外接矩形提取出來
dev_set_color('pink')
dev_set_line_width(5)
dev_set_draw('margin')
dev_set_color('red')
gen_rectangle2(rectangle, maxrow, maxcolumn, maxphi, maxlength1, maxlength2)
disp_message(windowhandle,'寬度為:'+maxlength2/dpi*25.4, 'window',0,0, 'black', 'true')
disp_message(windowhandle,'長度為:'+maxlength1/dpi*25.4, 'window', 0,100, 'black', 'true')
disp_message(windowhandle,'角度為:'+maxphi, 'window',0,200, 'black', 'true')
Android 開發筆記
版本控制的注意事項 以下資料夾不要加入版本控制 bin bin是編譯的二進位制檔案的存放路徑 gen gen是android需要的資源檔案的原始檔存放的目錄 使用svn的時候要注意專案編譯的問題 在編譯的時候程式會把src資料夾裡面的檔案拷貝到bin裡面,但是svn是每個資料夾裡面都包含乙個隱藏的....
ORACLE 開發筆記
oracle 日期 submitdate datetime.parse submitdate tostring d m月 yyyy to date 2002 01 02 yyyy m dd select count 1 from l perm where cancel y and sysdate p...
開發筆記2
開發筆記2 2012 5 4 周五 系統報警資訊傳送程式開發。其它程式收集了報警資訊,如 硬碟滿 硬碟壞 網路連不通 使用者欠費 硬體裝置無法訪問等,這些程式已經實現了插入資料到幾張不同型別的表,類似流水日誌表,狀態變化表。我則在這個基礎上,對這些表寫個簡單觸發器,觸發器盡量簡單,然後呼叫同乙個儲存...