2011-06-03 523 views
17

我在C++中構建了一個識別程序,爲了使它更加健壯,我需要能夠找到圖像中物體的距離。如何判斷圖片中物體的(真實世界)距離?

假設我有一張圖像是在8.5 x 11的圖像上拍攝的22.3英寸圖像。系統可以正確識別尺寸爲319像素×409像素的圖片。
將實際高度和寬度(AH和AW)與像素高度和寬度(PH和PW)與距離(D)相關聯的有效方法是什麼?

我假設當我真的去使用公式時,PH和PW將與D和AH成反比,AW是常數(因爲識別的對象將始終是用戶可以指示寬度和高度的對象)。

+7

這裏涉及到更多的變數。相機使用的視角(焦距)是多少?圖像中有效像素的數量和縱橫比。圖像是否被裁剪?它在焦點上嗎? (改變焦點會影響視角的一點點)。我相信根據視角,像素密度和距離,可以算出一個公式。另外,請注意,當圖片/物體接近相機時,即使距離D的小差異可以使覆蓋的像素數量有較大的差異。 – Raze 2011-06-03 07:00:48

+0

請注意,如果拍攝的物體是8'乘11'且平坦,距離中心22'的相機距離角落23'。說一臺相機距離這樣一個物體22.3'遠遠超出了現實。 – MSalters 2011-06-03 10:26:19

+0

@ MSalters:對於我來說,稱之爲沿着相機軸「距離」的距離並儘可能精確地測量它是完全合理的。 – 2011-06-03 14:12:07

回答

4

我不知道你是否在某個時候改變了你的問題,但是我的第一個答案對你想要的很複雜。你可能可以做些簡單的事情。

1)長期和複雜的解決方案(更普遍的問題)

首先,你需要知道對象的大小。

你可以看看計算機視覺算法。如果你知道對象(它的尺寸和形狀)。你的主要問題是姿勢估計問題(即找到物體相對於相機的位置),從中可以找到距離。您可以查看[1] [2](例如,如果您有興趣,可以在其上找到其他文章)或搜索POSIT,SoftPOSIT。您可以將問題表述爲一個優化問題:找到姿態以最小化實際圖像與預期圖像(給定估計姿態的物體投影)之間的「差異」。這個差值通常是每個圖像點Ni與相應對象(3D)點Mi對於當前參數的投影P(Mi)之間的(平方)距離的總和。

由此您可以提取距離。

爲此,您需要校準相機(大致找到像素位置和視角之間的關係)。

現在,你可能不希望爲自己,您可以使用計算機視覺庫,如OpenCV的,甘道夫[3] ...

現在你可能會希望做一些更加簡單的代碼做了這一切(和近似)。如果您可以在相同「深度」(Z)處找到兩點之間的圖像距離,則可以將圖像距離d與實際距離D相關聯:d = a D/Z(其中a是參數相機相關的焦距,像素數,你可以找到使用相機校準)

2)短期的解決方案(爲您簡單的問題)

但這裏是(簡單,短)答案:如果你圖像在平行的平面上的「相機平面」(即,它是完全面對相機),可以使用:

PH = a AH/Z 
PW = a AW/Z 

其中Z是pi的平面的深度cture和a在相機的固有參數中。

爲了參考的針孔照相機模型涉及圖像配位M =(U,V),以世界協調M =(X,Y,Z)其中:

m ~  K  M 

[u] [ au as u0 ] [X] 
[v] ~ [ av v0 ] [Y] 
[1] [  1 ] [Z] 

[u] = [ au as ] X/Z + u0 
[v] [ av ] Y/Z + v0 

其中 「〜」 是指 「成比例的」 K是攝像機固有參數的矩陣。您需要進行相機校準以查找K參數。這裏我假設au = av = a和as = 0。

您可以從任何這些方程中恢復Z參數(或取兩者的平均值)。請注意,Z參數不是距物體的距離(物體的不同點上會有所不同),而是物體的深度(相機平面與物體平面之間的距離)。但我想這就是你想要的東西。

[1]線性N點相機姿勢的測定,隆泉和中單蘭

[2]湯阿完整的線性4-點算法相機姿勢的測定,利紅摯和建良

[3 ] http://gandalf-library.sourceforge.net/

1

這可能不是一個完整的答案,但可能會推動你在正確的方向。曾經見過美國航天局如何在太空中拍攝這些照片?他們在整個圖像上都有這些小小的十字架。就我所知,這就是他們如何得到關於物體的大小和尺寸的公平想法。解決辦法可能是讓對象知道圖片的正確大小和大小,然後計算其他人的相對值。你有時間做一些研究。如果這就是美國航空航天局這樣做的話,那麼應該值得一試。

我不得不說這是我在很長一段時間看到的最有趣的問題之一:D。我只注意到你只有兩個標籤附加到這個問題。添加更多與圖像相關的內容可能會對您有所幫助。

2

如果您知道真實世界物體的大小和相機的視角,然後假設您知道水平視角alpha(*),圖像的水平分辨率爲xres,則距離dw到圖像中間的物體,圖像中xp像素寬,xw米的廣泛在現實世界中可以導出如下(如何是你的trigonometry):

# Distance in "pixel space" relates to dinstance in the real word 
# (we take half of xres, xw and xp because we use the half angle of view): 
(xp/2)/dp = (xw/2)/dw 
dw = ((xw/2)/(xp/2))*dp = (xw/xp)*dp (1) 

# we know xp and xw, we're looking for dw, so we need to calculate dp: 
# we can do this because we know xres and alpha 
# (remember, tangent = oposite/adjacent): 
tan(alpha) = (xres/2)/dp 
dp = (xres/2)/tan(alpha) (2) 

# combine (1) and (2): 
dw = ((xw/xp)*(xres/2))/tan(alpha) 
# pretty print: 
dw = (xw*xres)/(xp*2*tan(alpha)) 

(*)α-=相機軸和線穿過最左邊的點上的中間行去之間的角度只是可見的圖像。

鏈接到您的變量: DW = d,XW = AW,XP = PW