Halcon基於dev_set_part顯示圖片正常長寬比的方法
阿新 • • 發佈:2018-12-16
回顧
之前博文中,曾經提到,通過計算欲顯示圖片和視窗控制元件長、寬比例,對影象本身進行放縮,再進行顯示的方法。 現在看來是因為當時對dev_set_part這個運算元的理解不到位造成的。 Halcon/C#混合程式設計實現任意圖片的原始長寬比顯示+形狀匹配定位
之前方法的缺點
之前的方法雖然也看似完成了目標,但是需要對圖片本身進行放縮處理。這就使得在UI互動時,互動得到的位置座標需要進行換算方可對應到影象的實際畫素座標。
正確的理解思路
想像我們有一張桌子,桌子上放了一個手機,現在我們用一個相機去給手機拍照,怎樣讓手機看起來佔圖片更大一些呢? 之前的方法相當於,我們把拍照用的相機位置固定了,然後,把真實世界的手機給放縮了。 正確的思路應該是,我們去調整相機的位置,遠近,使手機在相片中的位置和大小顯得變化了。事實上,真實的手機是沒有辦法放大和縮小的。
dev_set_part
這個運算元其實就相當於是你用來拍照的相機。它一共有五個輸入引數,第一個是視窗控制元件,後面四個是取景視野在真實世界中的左上角(列、行)和右下角座標(列、行)。
實現
基於這個運算元的功能,以下例證
dev_close_window ()
dev_open_window (0, 0, 400, 480, 'gray', WindowHandle)
set_window_param (WindowHandle, 'save_depth_buffer', 'true')
dev_clear_window ()
dev_update_window ('off')
dev_open_file_dialog ( 'read_image', 'default', 'default', Selection)
read_image (Image, Selection)
get_window_extents (WindowHandle, Row, Column, winWidth, winHeight)
showPicture (Image, winWidth, winHeight)
gen_rectroi (WindowHandle, winHeight, winWidth, Row3, Column3, Phi, Length1, Length2)
以下是showPicture的內容:
set_system ( 'int_zooming', 'false')
get_image_size (Image, Width, Height)
picWHRatio := 1.0 * Width / Height
winWHRatio := 1.0 * winWidth / winHeight
if (Width > winWidth or Height > winHeight)
* 如果圖片寬高比 大於 視窗寬高比
* 則寬度方向頂格
if (picWHRatio >= winWHRatio)
dispWidth := Width
dispHeight := Width / winWHRatio
dev_set_part (0, 0, dispHeight, dispWidth)
dev_display (Image)
endif
* 如果圖片寬高比 小於 視窗寬高比
* 則高度方向頂格
if (picWHRatio < winWHRatio)
dispWidth := Height * winWHRatio
dispHeight := Height
dev_set_part (0, 0, dispHeight, dispWidth)
dev_display (Image)
endif
else
* 如果圖片的長和寬都小於視窗,則以圖片的原真實尺寸顯示
dev_set_part (0, 0, winHeight, winWidth)
dev_display (Image)
endif
return ()
以下是gen_rectroi的內容
dev_set_colored (3)
draw_rectangle2_mod (WindowHandle, winHeight/2.0-1, winWidth/2.0-1, 0, winWidth/4.0, winHeight/4.0, Row3, Column3, Phi, Length1, Length2)
dev_set_color ('green')
gen_rectangle2_contour_xld (Rectangle, Row3, Column3, Phi, Length1, Length2)
dev_display (Rectangle)
dev_set_colored (3)
return ()
驗證
採用一張264×245大小的圖片,視窗的大小設定為400×480 則得到的顯示為 作為對比,如果不調整顯示區域,則預設填充整個視窗