Halcon中仿射变换&投影变形与图像校正
1. 二维图像的平移、旋转、缩放平移矩阵:旋转矩阵:逆时针为正缩放矩阵:2. 图像的仿射变换:不发生形变在Halcon中,定义仿射变换矩阵,方法如下:hom_mat2d_identity(HomMat2DIdentity) *创建一个空的仿射变换矩阵hom_mat2d_translate(HomMat2DIDentity,Xt,Yt,HomMat2DTranslate) *平移矩阵:Xt,Yt表示
·
1. 二维图像的平移、旋转、缩放
平移矩阵:
旋转矩阵:逆时针为正
缩放矩阵:
2. 图像的仿射变换:不发生形变
在Halcon中,定义仿射变换矩阵,方法如下:
hom_mat2d_identity(HomMat2DIdentity) *创建一个空的仿射变换矩阵
hom_mat2d_translate(HomMat2DIDentity,Xt,Yt,HomMat2DTranslate) *平移矩阵:Xt,Yt表示平移距离
hom_mat2d_rotate(HomMat2DIDentity,rad(phi),Px,Py,HomMat2DRotate) *旋转矩阵:Px,Py表示旋转中心
hom_mat2D_scale(HomMat2DIDentity,Sx,Sy,Px,Py,HomMat2DScale) *缩放矩阵:Sx表示缩放倍数,Px表示缩放基准点
应用仿射变换矩阵:
affine_trans_pixel *应用于像素点
affine_trans_point_2d *应用于二维点
affine_trans_image *应用于图像
affine_trans_region *应用于区域
affine_trans_contour_xld *应用于XLD轮廓
3. 投影变换:形变
主要用到的算子:
*该算子利用两个点坐标,计算变换矩阵(点1_X,点1_Y,点1_W, 点2_X,点2_Y,点2_W,HomMat2D表示一个结果矩阵)
hom_vector_to_proj_hom_mat2d ([Px],[Py],[Pw],[Qx],[Qy],[Qw], 'normalized_dlt', HomMat2D)
*投影变换,应用于图像
projective_trans_image (ImageReduced, TransImage, HomMat2D, 'bilinear', 'false', 'false')
简单理解,就是将点1和点2之间的位置关系用矩阵表示出来,得到HomMat2D这个矩阵。
4. 实例:
目的:将一个透视形变的标定板,进行图像校正
校正后:
上代码:
dev_close_window ()
read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/images/caliper/caliper_calib_12.png')
rgb1_to_gray (Image, GrayImage)
get_image_size (GrayImage, Width, Height)
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
dev_display (GrayImage)
XCoordCorners:=[]
YCoordCorners:=[]
*阈值处理,提取灰度在15-90之间的区域(灰度直方图)
threshold (GrayImage, Regions, 15, 90)
*将提取的区域,不相连的部分分割成若干个
connection (Regions, ConnectedRegions)
*面积筛选,选择面积在613-2871之间的区域(特征直方图)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 613.86, 2871.29)
*裁剪区域
reduce_domain (GrayImage, SelectedRegions, ImageReduced)
*创建边缘轮廓
gen_contour_region_xld (SelectedRegions, Contours, 'border')
*将边缘轮廓分割为边(ps: 正方形4条,6边形6条)
segment_contours_xld (Contours, ContoursSplit, 'lines_circles', 5, 4, 2)
count_obj (ContoursSplit, Number)
for Index := 1 to Number by 1
select_obj (ContoursSplit, ObjectSelected, Index)
*拟合每条边
fit_line_contour_xld (ObjectSelected, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
*存储当前的边顶点的X,Y坐标
tuple_concat (XCoordCorners, RowBegin, XCoordCorners)
tuple_concat (YCoordCorners, ColBegin, YCoordCorners)
endfor
Xoff:=100
Yoff:=100*Height/Width
*该算子利用两个点坐标,计算变换矩阵(Point1_X,Point1_Y,Point1_W, Point2_X,Point2_Y,Point2_W)
hom_vector_to_proj_hom_mat2d (XCoordCorners, YCoordCorners,[1,1,1,1], [Yoff,Yoff,Height-Yoff,Height-Yoff], [Xoff,Width-Xoff,Width-Xoff,Xoff], [1,1,1,1], 'normalized_dlt', HomMat2D)
*投影变换
projective_trans_image (ImageReduced, TransImage, HomMat2D, 'bilinear', 'false', 'false')
dev_display (TransImage)
原理:
- 首先对标定板边缘的黑线部分进行了阈值+面积筛选,得到:
- 然后将此区域分割成了4条边,并遍历得到每条边起始点的XY坐标值:
- 计算变换矩阵:已知的4个蓝色点(线段起始点),和4个红色点(通过图像长宽比例,绘制的点),为他们建立线性关联。
得到矩阵HomMat2D:
- 应用于图像。
以上,如有错误,欢迎批评指正,谢谢。。。
更多推荐
所有评论(0)