[英]Recalculating the image points using camera calibration parameters from Opencv in Matlab
我已經在這里使用OpenCv代碼獲得了相機校准參數,例如相機矩陣,失真系數,(旋轉+平移)矢量和圖像點。
通過對攝像機矩陣,旋轉+平移向量和Matlab中的對象點坐標(X,Y,Z,1)進行硬編碼,我無法獲得與圖像點相同的坐標值。 我在這里錯過了什么? 我是否還需要考慮失真系數以獲得精確或正確的圖像點?
Matlab代碼:
% Define all the parameters camera matrix , sample image point, object point, rotation and translation vectors%
cameraMatrix = [5.9354 0 3.1950; 0 5.9354 2.3950 ; 0 0 1]
rotationMatrix = [2.5233 1.6803 3.0728];
translationMatrix = [1.2682 1.9657 8.0141];
X = [0; 0; 0; 1];
rotationMatrix = transpose(rotationMatrix);
translationMatrix = transpose(translationMatrix);
%convert the rotation vector into rotation matrix using Rodrigues func.%
rotMat = rodrigues(rotationMatrix);
R_T = horzcat(rotMat, translationMatrix)
%Convert to 2D points%
imgPts = cameraMatrix * R_T * X
lastElement = imgPts(end);
ScreenImgPts = imgPts / lastElement
對象點由棋盤方形大小(30mm)的平方大小定義,即[0,0,0,1],[30,0,0,1]等。
但是經過我的計算和比較存儲在xml文件中的圖像點是不一樣的。 我的結果如下
第一點,第二點和第三點的輸出(圖像點)應為:
此處給出了所有參數的輸出文件
問題非常簡單,我將所有重要參數(相機矩陣,旋轉+平移)的值四舍五入到第4位,而在值的末尾有一個明確存在的指數(e)。 因此四舍五入導致不正確的值。
這是具有更正值的代碼
% Define all the parameters camera matrix , sample image point, object point, rotation and translation vectors%
cameraMatrix = [5.9354136482375827e+002 0. 3.1950000000000000e+002; 0. 5.9354136482375827e+002 2.3950000000000000e+002 ; 0 0 1;]
%Rotatoin and translation vector of different planes (snapshot)%
rotationVector = [2.5233190617669338e-001 1.6802568443347082e-001 3.0727563215131681e+000];
translationVector = [1.2682348793063555e+002 1.9656574525587070e+002 8.0141048598043449e+002];
% rotationVector = [2.3492892819146791e-001 1.6451261910667694e-001 3.0787833660290516e+000];
% translationVector = [1.2806533156889765e+002 1.9877886039281353e+002 8.0447195879431570e+002];
% rotationVector = [2.1721 1.6300 3.0619];
% translationVector = [1.2661 1.9511 8.0681];
distCoeffs = [1.0829115704079707e-001 -1.0278232972256371e+000 0 0 1.7962320082487011e+000]; % k1, k2, p1, p2, k3 %
k1 = distCoeffs(1);
k2 = distCoeffs(2);
p1 = 0;
p2 = 0;
k3 = distCoeffs(end);
% X = [0 0 0; 30 0 0]
rotationVector = transpose(rotationVector);
translationVector = transpose(translationVector);
%convert the rotation vector into rotation matrix using Rodrigues func.%
rotMat = rodrigues(rotationVector)
R_T = horzcat(rotMat, translationVector)
%Convert to 2D points%
% imgPts = cameraMatrix * R_T * X
%
% lastElement = imgPts(end)
%
% ScreenImgPts = imgPts / lastElement
%%%%%%%%%%%%%% Adding calculation for distortion parameters%%%%%%%%%%
objectPoints = [0 0 0; 30 0 0; 60 0 0; 90 0 0; 120 0 0; 150 0 0;180 0 0;
0 30 0; 30 30 0; 60 30 0; 90 30 0; 120 30 0; 150 30 0; 180 30 0;
0 60 0; 30 30 0; 60 60 0; 90 60 0; 120 60 0; 150 60 0; 180 60 0;
0 90 0; 30 30 0; 60 90 0; 90 90 0; 120 90 0; 150 90 0; 180 90 0;
0 120 0; 30 120 0; 60 120 0; 90 120 0; 120 120 0; 150 120 0; 180 120 0;]
Xelement = [];
screenCoords = [];
NormXY = [];
for i = 1:35
Xelement = (objectPoints(i,:))
NormXY(:,1) = (rotMat * transpose(Xelement)) + translationVector
lastElement = NormXY(end)
NormXY = NormXY / lastElement
x = NormXY(1)
y = NormXY(2)
r2 = power(x,2) + power(y,2)
r4 = power(r2,2)
r6 = power(r2,3)
xcorr = x * (1 + k1*r2 + k2*r4 + k3*r6)
ycorr = y * (1 + k1*r2 + k2*r4 + k3*r6)
XY = [xcorr ;ycorr;1]
screenCoords(:,i) = cameraMatrix * XY
end
是的,你需要考慮失真。 此外,如果您在MATLAB中工作,可能更容易使用內置在Camera Calibrator App中的 MATLAB。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.