java - 使用opencv对网球场进行3D估算

标签 java opencv camera-calibration

我正在尝试根据单张图像对网球场进行相机校准和 3D 估计。首先作为预处理,我进行精明的边缘检测,然后应用霍尔变换来获取线条。从这里我清理图像以获得球场边缘。 sample image after hoare transform .由此我试图估计球场的 3D 姿态(可能在相机校准之后)。 opencv 中的相机校准方法似乎适用于预先存在的模式。据我所知,球场尺寸是否有任何方法可以从单个图像中获取 3D 参数?或者我们可以更容易地从平行线计算出相应的矩阵吗?

最佳答案

这是一个尝试...

第 1 步:我点击了您基本上已经找到的相机图像中的“已知”世界点。我在 MATLAB 中运行了 ginput 并点击了 14 个点的交点,这些交点应该可以从你的 Hough 线导出。以下是这些点,以像素为单位(您可以将它们绘制在原始图像之上以查看它们的位置):

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
   ]';

第2步:我计算了相应的世界点,将球场的左上角作为原点(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

关于java - 使用opencv对网球场进行3D估算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22921865/

相关文章:

java - 如何在java中锁定Stage的大小

python - 如何使用相机矩阵使图像不失真?

opencv - 我可以使用已知对象大小而不是平面来估计相机姿势/外部参数吗?

C++、OpenCV:异步运行 cuda::dft

c++ - 如何使用 Xcode 附带的命令行工具使用外部库编译和构建程序?

image - 将素描(绘图)人脸照片与数码彩色照片相匹配

opencv - 如何使用opencv捆绑调整

java - 如何找到我定义 JAVA_HOME 的位置

java - 如何使用 Parcelable 在 Activity 之间传递带有其他对象列表的对象?

java - 如何使用 log4j 分别创建自定义日志和调试日志