Halcon子模板ROI計算
對應精確定位,一般的做飯是首先粗定位,然後通過粗定位的結果在相對於此結果的某個位置中搜索圓、直線、矩形等進行精確定位,本文所講的就是如何通過粗定位的結果去確定二次精確定位的搜索範圍。
如下圖,要粗定位正方形後通過紅色線來精確定位,則粗定位後會找到正方形的中心(x,y),要在此基礎上偏移(50,0)後去搜索直線。本文旨在說明如何確定搜索的位置範圍。
通常簡單的平移操作可以手動對座標系的座標值進行加減完成,但是如果加入了旋轉呢?此時也許使用Halcon提供的仿射變換功能更適合,免去手動轉換的麻煩。
* 方式1:使用仿射變換矩陣
HomMat2D是Halcon提供的2D仿射變換矩陣類,支持平移、旋轉、縮放、錯切等。
該轉換矩陣可以通過若干方法創建,
例如:VectorAngleToRigid
VectorFieldToHomMat2d
VectorToAniso
VectorToEssentialMatrix
VectorToFundamentalMatrix
VectorToFundamentalMatrixDistortion
VectorToHomMat2d
VectorToProjHomMat2d
VectorToProjHomMat2dDistortion
VectorToRigid
VectorToSimilarity
一般的旋轉+平移變換,用的最多的就是VectorAngleToRigid,參數如下:
void HHomMat2D::VectorAngleToRigid(double Row1, double Column1, double Angle1, double Row2, double Column2, double Angle2)
//Row1:初始原點的row
//Column1:初始原點的column
//Angle1:初始原點的角度,單位:弧度
//Row2:變換後原點的row
//Column2:變換後原點的column
//Angle2:變換後的角度,單位:弧度
//注意:affine_trans_pixel 和 affine_trans_point_2d的不同,他們的不同在於所使用的座標系原點不同,affine_trans_pixel 使用的是圖像座標系,即原點位於圖像的左上角第一個像素,使用row和column來確定像素位置,而affine_trans_point_2d的原點位於左上角第一個像素的中心,使用x和y來標識座標位置(實際原點相差(0.5,0.5))。
//並且在使用affine_trans_point_2d時如果使用圖像座標系,則row座標必須傳遞Px,列座標必須傳遞Py以保證旋轉方向的正確性。
下面給出一個小例子來驗證變換矩陣的使用
dev_clear_window ()
dev_set_color ('yellow')
read_image (Image, 'fabrik')
gen_rectangle2 (Rectangle, 300, 200, 0, 100, 20)
for Index := 0 to 200 by 10
vector_angle_to_rigid (200,200 ,0 ,300 ,300 ,rad(Index) , HomMat2D)
affine_trans_point_2d (HomMat2D, 150, 150, Qx, Qy)
affine_trans_point_2d (HomMat2D, 150, 250, Qx1, Qy1)
affine_trans_pixel (HomMat2D, 150, 150, RowTrans, ColTrans)
affine_trans_pixel (HomMat2D, 150, 250, RowTrans1, ColTrans1)
affine_trans_region (Rectangle, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
dev_set_color ('cyan')
dev_display (RegionAffineTrans)
dev_set_color ('red')
disp_line (3600, Qx1, Qy1, Qx, Qy)
dev_set_color ('green')
disp_line (3600, RowTrans, ColTrans, RowTrans1, ColTrans1)
dev_set_color ('light gray')
disp_line (3600, 150, 150, 150, 250)
endfor
效果圖如下:
* 對於使用測量對象的方式來精確定位的,可以直接設置測量對象的相對座標系來免去使用變換矩陣來計算位置。
主要用到兩個函數:
* 設置相對座標系
area_center (RegionDifference, Area, RowCenter, ColumnCenter)
set_metrology_model_param (MetrologyHandle, ‘reference_system’, [RowCenter,ColumnCenter,0])
align_metrology_model (MetrologyHandle, ModelRow, ModelColumn, ModelAngle)
簡單兩步省去變換的煩惱。