2014-04-07 29 views
2

我正在嘗試使用單個圖像對網球場進行相機校準和3D估計。首先作爲預處理,我做canny邊緣檢測,然後應用hoare變換來獲取線條。從這我清理圖像,以獲得法院的邊緣。 sample image after hoare transform。從這我試圖估計法​​院的3D姿勢(可能是在照相機校準之後)。 opencv中的相機校準方法似乎適用於現有的模式。據我所知,法庭維度是否有任何方法從單個圖像獲取3D參數?或者我們可以更容易地從平行線計算相應的矩陣嗎?使用opencv對網球場進行3D估計

+0

我認爲這應該是可行的。給定足夠的點對應關係2D <-> 3D,您應該能夠檢索內在和外在矩陣。已知法院模式的 – aardvarkk

+0

應該很容易校準。使用平行線afaik,您至少需要2或3個消失點(不同的線方向),但在該圖像中,由於水平線與圖像平面完全平行,因此只會得到一個消失點。 – Micka

回答

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

第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

+0

這很不錯。讓我馬上試試這個!謝謝!! – Arun