1

通常我使用这种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 参考点集来获得投影变换矩阵,然后是二维桌面的投影图像。

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

提前致谢。

4

1 回答 1

2

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

正如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
于 2016-01-28T13:40:07.597 回答