如何在MATLAB中自相机校准中计算相机矩阵?

时间:2017-05-18 18:18:43

标签: matlab projection camera-calibration calibration

我的目标是在视频中的排球场周围放置图片(广告)。广告需要具有正确的透视失真,我无法访问相机型号,因此我需要进行自相机校准(我不能使用棋盘等)。我将使用世界坐标中已知大小的参考点。因此,我使用靠近网的矩形区域。我从包含排球场的自上而下视图(表示场的模型图像)和第一帧的对应点(称为 movingPoints_f1 )的图片中选择了该区域的角落并且我通过应用线路检测算法跟踪整个视频中的这些点,这些算法称为 nearest_points 。然后,我在第三维中连接这些点:

imgPoints = cat(3, closest_points, movingPoints_f1)

然后像这样计算相机参数:

cameraParams = estimateCameraParameters( imgPoints, fixedPoints)

其中 fixedPoints 是排球场模型的坐标。

之后我计算了每一帧的旋转矩阵和平移向量 - 因为相机的位置在世界坐标中变化(它正在平移) - 以及相应的相机矩阵如下:

[rotationMatrix,translationVector] = extrinsics( closest_points,fixedPoints,cameraParams)
camMat = cameraMatrix(cameraParams,rotationMatrix,translationVector);

现在, camMat 可以使用以下公式根据本文档https://nl.mathworks.com/help/vision/ug/camera-calibration.html将世界坐标点映射到图像坐标:

mapping points from world coordinates to image coordinates

我计算广告的每个像素的相应图片点(正在更改两个for语句):

fieldCoord = topLeftCorner+[column row];
world_hmg = [fieldCoord 0 1];
scaled_img_coordinates_hmg = double(world_hmg) * camMat;
img_coordinates_hmg = 1/scaled_img_coordinates_hmg(3) * scaled_img_coordinates_hmg;
img_coordinates_inhmg = img_coordinates_hmg(1:2);

我使用0作为Z坐标,因为广告在世界坐标中是平面的。而且我也将点从齐次坐标转换为非均匀坐标。之后,我基本上将像素从广告复制到字段:

fieldAd(int64(img_coordinates_inhmg(2)), int64(img_coordinates_inhmg(1)),:) = adImg(row, column,:);

但是,当我为广告中的每个像素转发广告时,广告中包含很多整体广告并且效果不佳。

我读过后向映射克服了这个问题(整体和重叠点),但 camMat 是4x3矩阵,因此是奇异矩阵。我无法计算它的倒数来做后向映射。

如何进行后向映射?或者还有另一种方法可以将广告正确地嵌入法庭吗?

0 个答案:

没有答案