程序流程
1.圖像採集
2.圖像灰度化
3.圖像二值化
4.圖像形態學閉運算
5.填充所有孔洞
6.計算所有連通域
7.計算區域方向
8.獲取區域中心位置座標
9.計算生成旋轉矩陣
10.旋轉圖像至水平方向
11.幾何測量,得到寬度(單位:像素)
本次實驗重點知識:仿射變換的應用
環境
筆記本電腦摺疊90度,利用其攝像頭完成實驗平臺搭建,在擴展屏上進行代碼編輯,筆記本屏幕壁紙更換爲白色背景,亮度調節至最高,減少陰影影響,使用自制小紙片。
相關代碼:
* 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] ', 0, -1, AcqHandle)
grab_image_start (AcqHandle, -1)
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
* dev_update_off ()
while (true)
grab_image_async (Image, AcqHandle, -1)
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions, 149, 206)
closing_rectangle1 (Regions, RegionOpening, 10, 10)//形態學閉運算,模版爲矩形
fill_up (RegionOpening, RegionFillUp)
orientation_region (RegionFillUp, Phi)//區域方向計算,得到弧度Phi
area_center (RegionFillUp, Area, Row, Column) //獲得區域座標,面積
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)//生成旋轉矩形
affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')//旋轉操作
//以下測量部分代碼使用測量助手生成
* Measure 02: Code generated by Measure 02
* Measure 02: Prepare measurement
AmplitudeThreshold := 49
RoiWidthLen2 := 29
set_system ('int_zooming', 'true')
* Measure 02: Coordinates for line Measure 02 [0]
LineRowStart_Measure_02_0 := 241.682
LineColumnStart_Measure_02_0 := 320.184
LineRowEnd_Measure_02_0 := 260.591
LineColumnEnd_Measure_02_0 := 1232.32
* Measure 02: Convert coordinates to rectangle2 type
TmpCtrl_Row := 0.5*(LineRowStart_Measure_02_0+LineRowEnd_Measure_02_0)
TmpCtrl_Column := 0.5*(LineColumnStart_Measure_02_0+LineColumnEnd_Measure_02_0)
TmpCtrl_Dr := LineRowStart_Measure_02_0-LineRowEnd_Measure_02_0
TmpCtrl_Dc := LineColumnEnd_Measure_02_0-LineColumnStart_Measure_02_0
TmpCtrl_Phi := atan2(TmpCtrl_Dr, TmpCtrl_Dc)
TmpCtrl_Len1 := 0.5*sqrt(TmpCtrl_Dr*TmpCtrl_Dr + TmpCtrl_Dc*TmpCtrl_Dc)
TmpCtrl_Len2 := RoiWidthLen2
* Measure 02: Create measure for line Measure 02 [0]
* Measure 02: Attention: This assumes all images have the same size!
gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 1280, 720, 'nearest_neighbor', MsrHandle_Measure_02_0)
* Measure 02: ***************************************************************
* Measure 02: * The code which follows is to be executed once / measurement *
* Measure 02: ***************************************************************
* Measure 02: The image is assumed to be made available in the
* Measure 02: variable last displayed in the graphics window
copy_obj (ImageAffineTrans, Image, 1, 1)
* Measure 02: Execute measurements
measure_pairs (Image, MsrHandle_Measure_02_0, 1, AmplitudeThreshold, 'all', 'all', Row1_Measure_02_0, Column1_Measure_02_0, Amplitude1_Measure_02_0, Row2_Measure_02_0, Column2_Measure_02_0, Amplitude2_Measure_02_0, Width_Measure_02_0, Distance_Measure_02_0)
* Measure 02: Do something with the results
endwhile
close_framegrabber (AcqHandle)
實驗效果
原圖:
旋轉過後:
測量結果: