已经在两个图像上的蓝点之间建立了一对一的点匹配。image2是image1的扭曲版本。失真模型似乎是眼镜片的失真。问题是:有没有办法计算一个描述这种转变的变换矩阵。实际上是一个矩阵,它将第一张图像上的蓝点转换为第二张图像上相应的蓝点?这里的问题是我们不知道焦距(意味着图像未校准),但是我们在两张图像上大约200个点之间有完美的匹配。

失真的图像:

发布于 2013-01-22 21:52:46
我认为你正在尝试做的事情可以被视为一个失真校正问题,而不需要传统的相机校准的其余部分。
矩阵变换是线性变换,线性变换总是将直线映射为直线(http://en.wikipedia.org/wiki/Linear_map)。从图中可以明显看出,变换是非线性的,因此您不能用矩阵运算来描述它。
也就是说,您可以使用像OpenCV (http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html)使用的镜头失真模型,并且获得系数应该不是很困难。以下是您可以在Matlab中执行的操作:
将(x,y)称为原始点(上图)的坐标,将(xp,yp)称为变形点(下图)的坐标,两者都移动到图像的中心,并除以比例因子(x和y相同),因此它们或多或少位于-1,1区间内。失真模型为:
x = ( xp*(1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p1*xp*yp + p2*(r^2 + 2*xp^2));
y = ( yp*(1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p2*xp*yp + p1*(r^2 + 2*yp^2));哪里
r = sqrt(x^2 + y^2);您有5个参数:用于径向和切向扭曲的k1、k2、k3、p1、p2和200对点,因此您可以求解非线性系统。
确保工作区中存在x、y、xp和yp数组,并将其声明为全局数组:
global x y xp yp编写一个函数来计算给定一组任意失真系数的均方误差,假设它被称为'dist':
function val = dist(var)
global x y xp yp
val = zeros(size(xp));
k1 = var(1);
k2 = var(2);
k3 = var(3);
p1 = var(4);
p2 = var(5);
r = sqrt(xp.*xp + yp.*yp);
temp1 = x - ( xp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p1*xp.*yp + p2*(r.^2 + 2*xp.^2));
temp2 = y - ( yp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p2*xp.*yp + p1*(r.^2 + 2*yp.^2));
val = sqrt(temp1.*temp1 + temp2.*temp2);用‘fsolve’解算系统:
[coef, fval] = fsolve(@dist, zeros(5,1));“coef”中的值是您要查找的失真系数。要纠正原始集合中不存在的新点(xp,yp)的扭曲,请使用以下公式:
r = sqrt(xp.*xp + yp.*yp);
x_corr = xp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p1*xp.*yp + p2*(r.^2 + 2*xp.^2);
y_corr = yp.*(1 + k1*r.^2 + k2*r.^4 + k3*r.^6) + 2*p2*xp.*yp + p1*(r.^2 + 2*yp.^2);结果将移动到图像的中心,并根据上面使用的因子进行缩放。
备注:
https://stackoverflow.com/questions/14405659
复制相似问题