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

news/2024/11/24 9:28:02/

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)


http://www.ppmy.cn/news/91671.html

相关文章

多层感知机学习XOR实例

多层感知机学习XOR实例 多层感知机介绍使用多层感知机学习XOR实例传统统计数学方法(传统机器学习)使用多层感知机学习XOR 总结 多层感知机介绍 多层感知机(Multilayer Perceptron,MLP),又称为深度前馈网络…

改变开发的未来 | 探索无服务器与人工智能的协同效应

近年来,无服务器计算和人工智能深刻改变着应用程序的开发方式。 无服务器计算实现无需管理底层基础架构就能构建和运行应用程序,而人工智能则让应用程序依据数据和算例做出智能决策。借助云计算,开发者打开了一个应用程序开发、构建的全新世…

四川省棒球建设与未来发展·棒球4号位

四川省作为中国西南地区的一个重要省份,在体育领域有着丰富的资源和悠久的历史。近年来,随着棒球在中国的逐渐普及,四川省也在积极推进棒球运动的发展。以下是四川省棒球建设与未来发展的一些建议和展望。 当前棒球建设 1. 基础设施建设&…

【P34】JMeter ForEach控制器(ForEach Controller)

文章目录 一、ForEach控制器(ForEach Controller)参数说明二、准备工作三、测试计划设计 一、ForEach控制器(ForEach Controller)参数说明 可以对一个组变量进行循环迭代;该组件通常与后置处理器中的 JSON 提取器、正…

Springboot +spring security,解决跨域问题

一.简介 这篇文章主要是解释什么是跨域,在Spring中如何解决跨域,引入Spring Security后Spring解决跨域的方式失效,Spring Security 如何解决跨域的问题。 二.什么是跨域 跨域的概率: 浏览器不能执行其他网站的脚本&#xff0c…

[Daimayuan] pSort(C++,强连通分量)

题目描述 有一个由 n n n 个元素组成的序列 a 1 , a 2 , … , a n a_1,a_2,…,a_n a1​,a2​,…,an​;最初,序列中的每个元素满足 a i i a_ii ai​i。 对于每次操作,你可以交换序列中第 i i i 个元素和第 j j j 个元素当且仅当满足 …

《操作系统》——计算机系统概述

前言: 在之前的【Linux】学习中,我们已经对常见指令已经开发工具等进行了详细的了解。紧接着,我们将要学习的便是关于【Linux进程】的基本知识。但是为了帮助大家更好的理解相关的知识概念,我先带领大家来学习关于《操作系统》这…

图像生成简单介绍并给出相应的示例代码

文章目录 图像生成简单介绍并给出相应的TensorFlow示例代码1. 介绍2. 准备工具和库3. 数据集准备4. 创建生成对抗网络(GAN)模型5. 训练模型6. 生成新图像7. 总结 图像生成简单介绍并给出相应的TensorFlow示例代码 图像生成是计算机视觉中的一个重要任务…