如何生成最适合多个 4 点集的射影变换矩阵



通常我使用这种 matlab 代码对一组参考点进行射影变换:

fixedpoints = [0 0; 50 0; 50 100; 0 100];
movingpoints= [752 361; 888 361; 885 609; 736 609];
transformationtype='projective';
tform = fitgeotrans(movingpoints,fixedpoints,transformationtype);
Imagepr = imwarp(Image,tform);

现在我有一张照片,显示一些(例如 10 张)杂乱无章的纸张,每张纸都有已知的尺寸,放在一张普通的大桌子上。这些床单之间的距离是未知的。

因此,我将有 10 个 4 参考点集来获得射影变换矩阵,然后获得 2D 表表面的投影图像。

如何生成优化的变换矩阵(以及后来的投影图像),其中包括所有 4 点集作为最佳拟合?

提前谢谢。

我觉得有必要重新表述问题如下:您有一个桌子,其中的矩形纸*位于任意位置,相机在任意位置拍摄的图像。您希望计算将表平面映射到图像(或相反)的同形变换。每张纸的四个角的坐标在图像中是已知的,但在桌子上不是,并且对应不可用。表的参考坐标系是任意的。

正如OP所暗示的,可以通过为角分配"表格"坐标来独立解决每张纸的问题。方程是线性的。(无论如何,通过交换床单的长边和短边,可以有两种解决方案。

似乎

不可能组合各种每张纸的解决方案,因为片材的相对位置是未知的,并且系数是不相关的。

从初始解开始,可以考虑使用最小二乘方法来细化解,从而最大限度地减少已知边长与变换估计的边长之间的总差异。(我们可以使用已知的边和对角线,即使这六个元素中的一个可以从其他五个元素中导出。方向歧义是通过采用提供最小差异的方向来解决的。

不幸的是,方程并不好,需要Levenberg-Marquardt或约束最小化:大锤。

OP提出了一个很好的建议:求解所有工作表的投影问题并计算每个工作表的差异度量,并保持解决方案具有最小差异。这让人想起 RANSAC,其中不是随机尝试,而是进行详尽的搜索**。

如果想进一步改进这个解决方案(大概已经相当不错了),可以考虑无导数的方法,如单纯形(Nelder-Mead),Hooke-Jeeves模式或顺序下降,试图改善差异度量。

采用少数最佳解决方案的好处是,可以为增量应用于系数提供一个数量级。由于"表"坐标系不是固定的,因此出现了额外的困难。为了避免解的漂移,应该添加约束,例如到参考表角落的距离。

*如果纸张尺寸不同,如果工作表对应关系已知,我们可以使用相同的方法(但不需要确切的角对应关系)。

**如有必要,为了提高鲁棒性,应该可以在最小化中集成异常值剔除过程。


平面在图像上的投影由同形关系描述

X = (a x + b y + c) / (g x + h y + 1) 
Y = (d x + e y + f) / (g x + h y + 1)

有八个未知参数,需要四个点对应才能确定它们。

这些方程很容易线性化为

a x + b y + c                 - g X x - h X y = X
                d x + e y + f - g Y x - h Y y = Y

相关内容

  • 没有找到相关文章

最新更新