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

news/2024/7/5 3:51:06

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

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://lihuaxi.xjx100.cn/news/1162711.html

相关文章

你知道黑客是什么样?

1 前言 现代人的生活离不开互联网,提到互联网人们总会想到一个词,那就是黑客。对于黑客大家对他们的了解却只局限于电影、电视中他们“无处不在”的可怕和他们“翻手为云覆手为雨”的技术中。但真正的黑客到底是什么? 2 什么是黑客 笔挺的…

Ubuntu 18 设置时钟同步

Ubuntu 18自带了systemd-timesyncd服务来同步时钟,可以使用以下步骤来进行配置: 打开终端窗口,进入root用户权限:sudo su。 检查系统当前的时钟同步状态: timedatectl 如果输出类似下面的信息,表示NTP同步功…

基于InVEST模型的人类活动、重大工程生态成效评估、论文写作

查看原文>>>基于生态系统服务(InVEST模型)的人类活动、重大工程生态成效评估、论文写作 【学习目标】: 1) 采用InVEST模型,掌握产水(包括水源涵养)、碳存储(包括固碳)、土…

一些题的题解

一、 洛谷 B2137 判决素数个数 题目描述 求 X X X, Y Y Y 之间的素数个数(包括 X X X 和 Y Y Y)。 输入格式 两个整数 X X X 和 Y Y Y( 1 ≤ X , Y ≤ 1 0 5 1 \le X,Y \le 10^5 1≤X,Y≤105)。 输出格式 …

泛在操作系统的国内外主要产品

本文字数:724字 阅读时间:2 分钟 文章来源:《泛在操作系统实践与展望研究报告》 从使用环境角度看,泛在操作系统分为基础平台类操作系统和应用场景类操作系统。 01 基础平台类 主要包括桌面操作系统、移动智能终端操作系统、…

log4cpp的使用

log4cpp的使用逻辑构造基本模板布局的格式化目的地对象操作文件回卷文件 log4cpp的使用 逻辑构造 目的地Appender:用于表示日志系统最后输出到哪 布局Layout:表示你输出的格式,类似与printf 优先级Priority:常见的优先级有emerg&…

态路小课堂丨光口不亮?三种简单故障排查请查收!

在光链路中,当遇到交换机光口互连不亮情况时,很多人不知道如何处理。本文态路为您介绍三种简单故障排查方案,助您快速进行故障排查和问题定位。 一、首先检查一致性 1、两端光模块型号是否一致。一般包括速率、封装模式、接口类型、传输波长、…

数据库提权

数据库提权的前提就是得到数据库的账号密码。在webshell或本地进行提权。 数据库提权分为四步: 1.服务探针,探测出数据库的类型(端口扫描等) 2.信息搜集,就是获取到数据库的账号密码。权限要高。 读取数据库密码的…