我将一些图像加载到相机校准应用程序中,并将生成的相机参数导出到名为" 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);
我应该使用完全相同的参数(相机内在函数,旋转矩阵和平移向量)但仍然我的投影点与校准期间创建的不同,因此我的meanReprojErrors更高。知道为什么吗?
答案 0 :(得分:1)
您遇到了不同的重投影错误,因为您没有考虑失真。如果您在致电undistortImage
之前致电detectCheckrboardPoints
,那么您应该获得更接近校准期间计算出的重投影错误的值。