通常我使用这种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点集作为最佳拟合?
提前致谢。
答案 0 :(得分:2)
我觉得需要重新解决问题如下:你有一张桌子,在任意位置都有相同尺寸的矩形纸张,并且相机在任意位置拍摄的图像。您想要计算将表平面映射到图像(或相反)的单应变换。每张纸的四个角的坐标在图像中是已知的,但不在表上,并且点对应关系不可用。表的参考坐标系是任意的。
正如OP所暗示的那样,通过为角落分配“表格”坐标,可以独立解决每张纸的问题。方程是线性的。 (无论如何,通过交换纸张的长边和短边都可以实现两种解决方案。)
似乎无法组合各种单页解决方案,因为纸张的相对位置未知,且系数不相关。
从最初的解决方案开始,人们可以考虑使用最小二乘法来细化解决方案,最大限度地减少已知边长与变换估计的边长之间的总差异。 (我们可以使用已知的边和对角线,即使这六个元素中的一个可以从其他五个元素中导出。方向模糊性通过采用给出最小差异的方向来解决。)
不幸的是,方程式并不好,要求Levenberg-Marquardt或限制最小化:大锤。
OP提出了一个很好的建议:解决所有工作表的投影问题并计算每个工作表的差异度量,并保持解决方案的差异最小。这提醒了RANSAC,而不是随机尝试,进行了详尽的搜索**。
如果有人想进一步改进这个解决方案(可能是已经非常好的解决方案),可以考虑使用简单(Nelder-Mead),Hooke-Jeeves模式或连续下降等无衍生方法,试图改善差异度量。
采用少数最佳解决方案的好处是可以为增量应用系数提供一个数量级。由于“桌子”坐标系不固定,因此出现了额外的困难。为了避免解决方案的漂移,应该添加约束,例如到参考表角落的距离。
*如果纸张尺寸不同,我们可以使用相同的方法,如果已知纸张对应(但不需要精确的角落对应)。
**如果有必要,为了增加robustenss,应该可以在最小化中集成异常值拒绝过程。
通过单应关系描述平面在图像上的投影
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