欢迎使用CSDN-markdown编辑器

来源:互联网 发布:紫幽阁小说阅读软件 编辑:程序博客网 时间:2024/06/06 15:42

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

0 0
原创粉丝点击