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