Halcon标准坐标和以边为中心坐标
标准坐标
按照文档解释:此坐标是halcon标准坐标系,又叫图像坐标系,原点位于图像左上角第一个像素的中间,属于亚像素精确坐标。使用row,column表示位置
以边为中心
按照文档解释:此坐标是halcon以边为中心标系,原点位于图像左上角第一个像素的左上角,属于亚像素精确坐标。使用x,y表示位置
由此很明显的可以知道两个坐标系相差0.5个像素点
使用以边为中心坐标系的算子
翻译过来的意思是:
在HALCON中,算子运行在不同的坐标系统中。一方面,对象被期望在它运行在标准坐标中。另一方面,对于HomMat2D变换矩阵,算子需要具有上述变换优势的边缘中心坐标。
所以我觉得除了以边为中心坐标的算子,其他的算子应该都是标准坐标(个人见解)
使用以边为中心坐标系的算子
如上算子是采用边为中心坐标系的算子,如果使用这些算子就行变换,将会以边为中心坐标系进行。
同时,模板匹配也是运行在边为中心的坐标中,但是输出的原点坐标是已经转换为标准坐标的,可以直接使用affine_trans_contour_xld等算子进行变换而不会产生误差
会产生什么后果?
比如你使用area_center_xld算子求出xld重心点坐标,实际这个重心是标准坐标系下的坐标
然后你把它使用affine_trans_contour_xld进行重心点旋转,这个时候你会发现两个区域并不重合,
原因就是使用了两个不同坐标系导致的,怎么解决呢?
HomMat2dTranslate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
HomMat2dTranslateLocal(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
AffineTransContourXld(Contours, ContoursAffineTrans, HomMat2DAdapted)
如上代码所示进行补偿,经过affine_trans_contour_xld转换的坐标是边中心坐标,让其添加补偿后变为标准坐标
注意:只有当出现旋转时才会导致这种情况
affine_trans_pixel
该算子使用的是边中心坐标,只要涉及了旋转,算出的值就会导致其与标准坐标有误差
affine_trans_point_2d
该算子使用的是标准坐标,通常使用在手眼标定上
比如相机图像上的标准坐标转换为设备上的X,Y
而且根据文档所说,只要你保证所有操作都在一个坐标系上进行,那么affine_trans_point_2d实际可以运行在标准坐标和边中心坐标上的