如何使用matlab获取相机投影矩阵?

how to get camera projection matrix using the matlab?

首先感谢您的关注。

最近在尝试使用A compact algorithm for recification of stereo pairs中Andrea Fusiello1, Emanuele Trucco2, Alessandro Verri3提供的Matlab程序来矫正从我关于立体校准的研究项目中的两个相机。

虽然Matlab代码并不复杂,但是如何得到两个摄像头的投影矩阵还是让我一头雾水。 我使用以下 Matlab 代码获取每个相机的内部矩阵和 R 和 T。而且我想我可以使用以下公式获得投影矩阵:P = A1*[R|T]。但是,如图所示,结果很奇怪。

所以我认为我得到的投影矩阵有问题。谁能告诉我如何正确获取投影矩阵?

matlab代码:

numImages = 9;
files = cell(1, numImages);
for i = 1:numImages

files{i} = fullfile(matlabroot, 'toolbox', 'vision', 'visiondata', ...
    'calibration', 'left', sprintf('left%d.bmp', i));
end
[imagePoints, boardSize] = detectCheckerboardPoints(files);
squareSize = 120; 
worldPoints = generateCheckerboardPoints(boardSize, squareSize);
cameraParams = estimateCameraParameters(imagePoints, worldPoints);
imOrig = imread(fullfile(matlabroot, 'toolbox', 'vision', 'visiondata', ...
    'calibration', 'left', 'left9.bmp'));
[imagePoints, boardSize] = detectCheckerboardPoints(imOrig);
[R, t] = extrinsics(imagePoints, worldPoints, cameraParams);

后果:

Computer Vision System Toolbox 中有一个内置函数 cameraMatrix 来计算相机投影矩阵。

但是,如果您尝试进行立体校正,则应使用 Stereo Camera Calibrator app, and then use rectifyStereoImage function. See this example 校准一对立体相机。

要记住的是,计算机视觉系统工具箱中的函数使用 post 乘法约定,即行向量乘以矩阵。因此,旋转矩阵和相机投影矩阵是它们在 Trucco 和 Veri 以及其他教科书中的对应矩阵的转置。所以cameraMatrix使用的公式是

P = [R;t] * K

所以 P 最终是 4×3,而不是 3×4。这可以解释为什么您会得到奇怪的结果。