OpenCV使用3D估算法来估算网球场地。

4
我正在尝试对网球场进行单张图像的相机标定和三维估计。首先,我进行Canny边缘检测,然后应用霍夫变换获取直线。从这个结果中,我清理图像以获取球场边缘。从这里开始,我尝试估计球场的三维姿态(可能需要进行相机标定)。OpenCV中的相机标定方法似乎是针对预先存在的模式的。既然我知道球场的尺寸,是否有办法从单张图像中获取3D参数?或者我们可以更容易地通过平行线计算相应的矩阵吗?hoare transform处理后的示例图像

我认为这应该是可行的。只要有足够的二维和三维点对应,你就能够恢复出内参矩阵和外参矩阵。 - aardvarkk
有了已知的校准模式,校准应该很容易。据我所知,使用平行线需要至少2或3个消失点(不同的线方向),但在该图像中,由于水平线与图像平面相当平行,因此您只会得到一个消失点。 - Micka
1个回答

1
这是我的尝试...
步骤1:我在相机图像中点击了您已经找到的“已知”世界点。我在MATLAB中运行了 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
]';

步骤3:我们现在有许多相机点和世界点之间的对应关系。我使用了相机标定工具箱来推导相机的外参和内参参数。请注意,由于我们只有很少的对应关系,我跳过了畸变参数和纵横比的计算(这些应该非常接近于1.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');

这里是生成的图片:

enter image description here


@aardvark 这个有没有 Python 的教程,不用 Matlab? - mLstudent33
我不知道有没有其他人这样做过 - 我相信这只是我自己想出来的。 - aardvarkk
@aardvark,我知道网的中央带的高度,网柱和使用OpenPose对球员进行估算身高以及在各种击球时球的撞击高度。这足以创建一个3D模型,以便我可以跟踪弹道,包括球的弹跳点吗?这是我目前所拥有的“演示”:https://youtu.be/QctKFhOkqKg - mLstudent33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接