欢迎使用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)
简单两步省去变换的烦恼。

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