单应性变换 Homography Estimation

本文介绍如何通过至少4对同名点计算单应性变换矩阵,实现同一平面在不同角度下的图像坐标转换。利用SVD分解求解未知参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

应用背景:

已知同一个平面标定板在两个不同角度下的图像,根据图像上对应点的二维(u, v)坐标求解其变换矩阵。单应性变换是两个平面之间的几何变换,利用至少4对以上的同名点计算变换矩阵。

原理介绍

角度A下图像中一点的坐标(u1,v1)(u_1, v_1)(u1,v1) , 对应的在角度B下的坐标为(u2,v2)(u_2,v_2)(u2,v2), 两个点之间的单应性变换可以表示为:zc2[u2v21]=[H11H12H13H21H22H23H31H32H33]zc1[u1v11]z_{c2}\begin{bmatrix} u_2\\v_2\\1 \end{bmatrix} = \begin{bmatrix} H_{11}&H_{12}&H_{13}\\ H_{21}&H_{22}&H_{23}\\H_{31}&H_{32}&H_{33}\end{bmatrix}z_{c1}\begin{bmatrix} u_1\\v_1\\1 \end{bmatrix}zc2u2v21=H11H21H31H12H22H32H13H23H33zc1u1v11根据矩阵展开可以得到两个等式,即u2(H31u1+H32v1+H33)=H11u1+H12v1+H13u_2(H_{31}u_1+H_{32}v_1+H_{33})=H_{11}u_1+H_{12}v_1+H_{13} u2(H31u1+H32v1+H33)=H11u1+H12v1+H13v2(H31u1+H32v1+H33)=H21u1+H22v1+H23v_2(H_{31}u_1+H_{32}v_1+H_{33})=H_{21}u_1+H_{22}v_1+H_{23} v2(H31u1+H32v1+H33)=H21u1+H22v1+H23由此可见,1组对应点能提供2个等式。单应性矩阵虽然是3x3共9个参数,但是变量是8个,上式的左右两边可以同时除以一个变量,去除一个相关变量。对于8个变量需要提供4对以上的点对组合才能解算。
将上式的左边移到右边,可以得到类似Ax=0Ax=0Ax=0的矩阵形式,利用SVD分解来求解x=(H11,H12,H13,H21,H22,H23,H31,H32,H33)x=(H_{11},H_{12},H_{13},H_{21},H_{22},H_{23},H_{31},H_{32},H_{33})x=(H11,H12,H13,H21,H22,H23,H31,H32,H33),其中A=[u1v11000−u1∗u2−v1∗u2−u2000u1v11−u1∗v2−v1∗v2−v2......] A=\begin{bmatrix} u_1&v_1&1&0&0&0&-u_1*u_2&-v_1*u_2&-u_2 \\ 0 & 0&0&u_1&v_1&1&-u_1*v_2&-v_1*v_2&-v_2 \\ ...\\...\end{bmatrix} A=u10......v10100u10v101u1u2u1v2v1u2v1v2u2v2

代码实现

使用EIGEN库的主要计算代码如下,

// 计算单应性矩阵
int nPairSize = vCodedPairPt.size();
if (nPairSize < 4)
{
	cout << "匹配对数少于4对" << endl;
	return 0;
}
MatrixXd MatrixA(2 * nPairSize, 9);
double u1, v1, u2, v2;
int index = 0;
for (int i = 0; i < nPairSize; i++)
{
	u1 = vCodedPairPt[i].first->pt.dX;
	v1 = vCodedPairPt[i].first->pt.dY;
	u2 = vCodedPairPt[i].second->pt.dX;
	v2 = vCodedPairPt[i].second->pt.dY;
	index = i * 2;
	MatrixA(index, 0) = u1,     	 MatrixA(index, 1) = v1, 		  MatrixA(index, 2) = 1;
	MatrixA(index, 3) = 0,  		 MatrixA(index, 4) = 0, 		  MatrixA(index, 5) = 0;
	MatrixA(index, 6) = -u1*u2,      MatrixA(index, 7) = -v1*u2,      MatrixA(index, 8) = -u2;
	MatrixA(index + 1, 0) = 0,       MatrixA(index + 1, 1) = 0,       MatrixA(index + 1, 2) = 0;
	MatrixA(index + 1, 3) = u1,      MatrixA(index + 1, 4) = v1,      MatrixA(index + 1, 5) = 1;
	MatrixA(index + 1, 6) = -u1*v2,  MatrixA(index + 1, 7) = -v1*v2,  MatrixA(index + 1, 8) = -v2;
}
//cout << "MatrixA: " << MatrixA << endl;
JacobiSVD<MatrixXd> svd(MatrixA, ComputeThinU | ComputeThinV);
MatrixXd MatrixU;
MatrixU = svd.matrixV();
int nCols = MatrixU.cols();
VectorXd vSolution = MatrixU.col(nCols - 1);
Matrix3d MatrixH = Map<Matrix3d>(vSolution.data()).transpose();
cout << "MatrixH: " << MatrixH << endl;
### 回答1: Homography估计是一种计算机视觉技术,用于在两个平面之间进行几何变换。它可以用于图像配准、图像拼接、虚拟现实等应用中。Homography估计的目标是找到一个3x3的矩阵,将一个平面上的点映射到另一个平面上的点。这个矩阵可以通过多种方法来估计,包括最小二乘法、RANSAC等。 ### 回答2: Homography estimation是一种计算机视觉技术,指的是在图像处理中,通过计算两幅图像之间的变换关系,来实现不同图像之间的几何转换。这种技术可以应用于很多领域,包括但不限于机器人视觉、图像配准、增强现实、虚拟现实和数字图像处理等。 在homography estimation中,我们需要寻找两幅图像之间的变换矩阵。这个变换矩阵被称为幂律映射,可以将一幅图像的特征点集投影到另一幅图像的对应点集,从而实现两幅图像之间的几何变换。其中特征点可以是关键点、角点,也可以是一些其他算法提取出的特征点等。 常见的homography estimation算法有RANSAC和最小二乘法等。RANSAC算法是一种假设-验证的方法,它随机选择几个特征点,通过估计变换矩阵来验证这些点是否符合变换矩阵的假设。最小二乘法是一种基于矩阵代数的方法,通过最小化特征点之间距离的平方和来计算变换矩阵。 homography estimation的一个主要应用是图像配准。在医学影像、航拍影像、卫星影像等领域,需要将多幅图像进行配准,以实现更准确的测量和分析。homography estimation可以帮助我们计算不同图像之间的几何变换关系,从而实现图像的精确配准。 总之,homography estimation是一种重要的计算机视觉技术,它为图像处理和计算机视觉领域带来了很多便利和挑战。未来,随着人工智能和机器学习技术的不断发展,homography estimation将会得到更广泛的应用和深入的研究。 ### 回答3: homography estimation是指在计算机视觉中,通过图像对之间的空间变换关系来估计两个图像之间的投影映射。在计算机视觉领域中,对于单个图像来说,可以通过特征点的匹配关系来建立基础矩阵来描述两个图像之间的外参关系,而对于一组图像来说,则需要使用homography矩阵来描述它们之间的内参数和外参数关系。 homography estimation通常需要使用RANSAC算法来进行随机采样和模型拟合的过程,以确保对噪声和异常点有较好的鲁棒性和准确性。homography estimation主要应用于图像拼接、三维重建、目标跟踪、相机标定等领域,其优点在于适用于对于场景有较大的姿态变化、平面或近似平面场景、易于感知整个场景的视点调整等场景。同时,homography estimation也有其局限性,比如对于物体的旋转、缩放、形状变化等更为复杂的情况,其表现可能并不优秀。 总体来说,homography estimation可以为计算机视觉领域提供一种有效的图像对齐和重建的方法,有着广泛的应用场景和潜在的研究价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

居愉心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值