歡迎使用CSDN-markdown編輯器

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)
簡單兩步省去變換的煩惱。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章