再现摄像机重投影错误



我将一些图像加载到相机校准应用程序中,并将生成的相机参数导出到一个名为"oldCameraParams"的结构中。我现在要做的是再现校准过程中使用的其中一幅图像的重投影误差。我的目标是这样做:

I = imread(imagePath);
[imagePoints,boardSize] = detectCheckerboardPoints(I);
worldPoints = generateCheckerboardPoints(boardSize, squareSize);
squareSize = 30; 
camMatrix = cameraMatrix(oldCameraParams,oldCameraParams.RotationMatrices(:,:,1),oldCameraParams.TranslationVectors(1,:));
projectedPoints = [worldPoints zeros(size(worldPoints,1),1) ones(size(worldPoints,1),1)] * camMatrix;
projectedPoints = bsxfun(@rdivide,    projectedPoints(:,1:2),projectedPoints(:,3));
euclideanDistances = sqrt(sum((imagePoints - projectedPoints) .^2, 2));
meanReprojErrors(ii) = mean(euclideanDistances);

我应该使用完全相同的参数(相机特性,旋转矩阵和平移向量),但我的投影点仍然不同于校准期间创建的点,因此我的meanrejerrors更高。知道为什么吗?

你会得到不同的重投影误差,因为你没有考虑失真。如果在调用detectCheckrboardPoints之前调用undistortImage,那么您应该得到更接近校准期间计算的重投影误差的值。