Halcon中从两组点的对应关系生成仿射矩阵,及思考原理和代码实现

halcon中有几个算子有点类似,看了下区别

1.vector_to_rigid( : : Px, Py, Qx, Qy : HomMat2D)

2.vector_to_similarity( : : Px, Py, Qx, Qy : HomMat2D)

3.vector_to_aniso( : : Px, Py, Qx, Qy : HomMat2D)

vector_to_rigid 这个是刚性变换,

 只有旋转和平移。

vector_to_similarity 这个是相似变换

旋转和平移,加各方向等比例缩放

 vector_to_aniso 仿射变换

旋转、平移、各方向不同比例缩放

以上算子都可以到到对应的仿射矩阵。

思考原理,通过两组点怎么通过计算得到仿射矩阵

仿射矩阵形式为:\begin{bmatrix} a1 & a2&a3 \\ a4& a5& a6\\ 0& 0& 1 \end{bmatrix}

点A(x1,y1) 到点B(X1,Y1) 对用关系即为 X1=a1*x1+a2*y1+a3  Y1=a4*x1+a5*y1+a6

多个点就多个线性方程,最终是一个求解线性方程组的问题

转成矩阵形式即为(这里使用了3个点,可以更多)

\begin{bmatrix} x1& y1& 1& 0& 0&0 \\ 0& 0& 0& x1& y1& 1\\ x2& y2& 1& 0& 0&0 \\ 0& 0& 0& x2& y2&1 \\ x3& y3& 1 & 0& 0&0 \\ 0& 0& 0& x3& y3& 1 \end{bmatrix}*\begin{bmatrix} a1\\ a2\\ a3\\ a4\\ a5\\ a6 \end{bmatrix}=\begin{bmatrix} X1\\ Y1\\ X2\\ Y2\\ X3\\ Y3 \end{bmatrix}

在halcon中可以使用solve_matrix解矩阵

测试了两组数据,由点x变换到点y

x1:=[19,549]
x2:=[19,663]
x3:=[275,547]
x4:=[274,664]

y1:=[267,1134]
y2:=[331,1159]
y3:=[429,558]
y4:=[496,585]

用vector_to_aniso算子得到的变换矩阵为

[0.64363, 0.583832, -67.3593, -2.24947, 0.167049, 1087.92]

通过解矩阵方式得到的变换矩阵为

[0.64103, 0.569983, -58.5884, -2.25006, 0.215317, 1058.77]

基本一致,但为何不是相等,有点思路,但还没搞清楚

如图两个仿射变换如图

 halcon代码

read_image (Image, 'printer_chip/printer_chip_01')

x1:=[19,549]
x2:=[19,663]
x3:=[275,547]
x4:=[274,664]


gen_cross_contour_xld (Cross1, 19, 549, 6, 0.785398)
gen_cross_contour_xld (Cross2, 19, 663, 6, 0.785398)
gen_cross_contour_xld (Cross3, 275, 547, 6, 0.785398)
gen_cross_contour_xld (Cross4, 274, 664, 6, 0.785398)
gen_rectangle2 (ROI_0, 382.107, 860.444, rad(15.9103), 294.57, 32.8626)


y1:=[267,1134]
y2:=[331,1159]
y3:=[429,558]
y4:=[496,585]


X1:=[x1[0],x2[0],x3[0],x4[0]]
Y1:=[x1[1],x2[1],x3[1],x4[1]]

X2:=[y1[0],y2[0],y3[0],y4[0]]
Y2:=[y1[1],y2[1],y3[1],y4[1]]


gen_contour_polygon_xld (Contour, X2, Y2)
vector_to_aniso(X1, Y1, X2, Y2, HomMat2D)
affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false')

create_matrix(8,6,0,MatrixA)
Values:=[x1[0],x1[1],1,0,0,0,0,0,0,x1[0],x1[1],1,x2[0],x2[1],1,0,0,0,0,0,0,x2[0],x2[1],1,x3[0],x3[1],1,0,0,0,0,0,0,x3[0],x3[1],1,x4[0],x4[1],1,0,0,0,0,0,0,x4[0],x4[1],1]
set_full_matrix (MatrixA, Values)

Values2:=[y1[0],y1[1],y2[0],y2[1],y3[0],y3[1],y4[0],y4[1]]
create_matrix(8,1,0,MatrixB)
set_full_matrix (MatrixB, Values2)

solve_matrix (MatrixA, 'general', 0, MatrixB, MatrixResultID)

get_value_matrix (MatrixResultID, 0, 0, Value1)
get_value_matrix (MatrixResultID, 1, 0, Value2)
get_value_matrix (MatrixResultID, 2, 0, Value3)
get_value_matrix (MatrixResultID, 3, 0, Value4)
get_value_matrix (MatrixResultID, 4, 0, Value5)
get_value_matrix (MatrixResultID, 5, 0, Value6)

myHom2d:=[Value1,Value2,Value3,Value4,Value5,Value6,0,0,1]

affine_trans_image (Image, ImageAffineTrans1, myHom2d, 'constant', 'false')

boundary (ImageAffineTrans, RegionBorder, 'inner')
boundary (ImageAffineTrans1, RegionBorder1, 'inner')

dev_display (Image)
dev_display (ImageAffineTrans)
dev_display (ImageAffineTrans1)

dev_set_color ('red')
dev_display (RegionBorder)


dev_set_color ('green')
dev_display (RegionBorder1)

dev_display (Contour)

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值