我正在尝试对网球场进行单张图像的相机标定和三维估计。首先,我进行Canny边缘检测,然后应用霍夫变换获取直线。从这个结果中,我清理图像以获取球场边缘。从这里开始,我尝试估计球场的三维姿态(可能需要进行相机标定)。OpenCV中的相机标定方法似乎是针对预先存在的模式的。既然我知道球场的尺寸,是否有办法从单张图像中获取3D参数?或者我们可以更容易地通过平行线计算相应的矩阵吗?
ginput
,并单击了应该可以从您的霍夫线推导出的14个交点。以下是这些点,以像素为单位(您可以在原始图像上绘制它们,以查看它们的位置):x = [
161 118
193 119
382 116
412 116
181 149
288 147
393 146
134 268
287 266
440 266
36 358
98 358
473 352
535 353
]';
第二步:我计算了相应的世界坐标,将球场左上角视为原点(0,0,0),向下和向右增加。由于球场是一个平面,每个点的Z坐标都等于0。以下是这些点的英尺单位:
y = [
0 0 0
4.5 0 0
31.5 0 0
36 0 0
4.5 18 0
18 18 0
31.5 18 0
4.5 60 0
18 60 0
31.5 60 0
0 78 0
4.5 78 0
31.5 78 0
36 78 0
]';
以下是最终代码:
clc;
clear all;
img = imread('HSY1A.jpg');
nx = size(img,2);
ny = size(img,1);
% imshow(img,[]);
x = [
161 118
193 119
382 116
412 116
181 149
288 147
393 146
134 268
287 266
440 266
36 358
98 358
473 352
535 353
]';
y = [
0 0 0
4.5 0 0
31.5 0 0
36 0 0
4.5 18 0
18 18 0
31.5 18 0
4.5 60 0
18 60 0
31.5 60 0
0 78 0
4.5 78 0
31.5 78 0
36 78 0
]';
num_pts = size(y,2);
% Required by camera calibration toolbox
x_1 = x;
X_1 = y;
% Setting up calibration parameters
n_ima = 1;
est_aspect_ratio = 0;
est_dist = zeros(5,1);
% check_cond = 0;
% Run calibration
go_calib_optim;
%% Estimate original points
est_x_1 = KK * [Rc_1 Tc_1] * [X_1; ones(1, size(X_1,2))];
est_x_1 = est_x_1 ./ repmat(est_x_1(3,:),3,1);
%% Plot results
imshow(img,[]); hold on;
plot(est_x_1(1,:),est_x_1(2,:),'gs');
这里是生成的图片: