2013-07-06 157 views
10

我想知道我怎麼可以去計算相對於我使用的網絡攝像頭中的照片有些像素的角度之間計算的角度。我是新手,我正在使用網絡攝像頭。本質上,我拍攝一張照片並對其進行處理,最終得到的是我正在尋找的圖像中的像素值。然後我需要以某種方式將該像素值轉換爲一些有意義的數量---我需要找到穿過像素和相機的線條/矢量。我不需要大小,只是階段。OpenCV的:攝像頭和像素

怎麼去做這件事?攝像機校準是否必要?我一直在讀一點,但我不確定。

感謝

+2

爲了能夠做到這一點,你需要知道對應於像素的物體的距離,並且相機領域的視圖。 –

+0

好的,你有什麼建議可以解決我的問題。我基本上正在尋找一個特定的顏色對象。我找到了與我所尋找的顏色最匹配的像素座標,然後我需要能夠用某種方式說出對象的方向......如果沒有深度,這是不可能的?我原以爲我能夠從像素座標中獲得一些方位... –

+0

繪製一個情景圖。你有一個直角三角形,其角點是(A)物體,(B)相機,(C)在圖像中心的點,但在物體的深度平面。你打算如何計算角度ABC? –

回答

7

你並不需要了解物體的距離,只有分辨率和視攝像頭的角度。

計算的角度僅需要簡單的線性內插。例如,我們假設分辨率爲1920x1080的攝像機覆蓋對角線上的45度視角。

在這種情況下,sqrt(1920 + 1080 )沿對角線給出2292.19個像素。這意味着每個像素代表45/2292.19 = .0153994度。因此,計算距離中心的距離(以像素爲單位),乘以.0153994,並且從中心開始它的角度(對於該攝像機 - 對於您的攝像機,您顯然必須使用其分辨率和角度看法)。

當然,這多少有些近似 - 其精度取決於鏡頭多少失真。使用變焦鏡頭(特別是廣角),您通常可以指望它相當高。使用固定焦距的鏡頭(特別是如果它沒有覆蓋超過90度左右的角度),它通常會很低。

如果您想要提高準確性,您可以先在攝像機視角內用直線拍攝一個平直的矩形圖像,然後根據得到的圖像中完全筆直的偏差計算失真。如果您使用的是非常廣角的鏡頭,這可能幾乎是必不可少的。使用覆蓋更窄視角的鏡頭(特別是,如前所述,如果焦距固定),很少有可能是有價值的(這種鏡頭通常只有百分之一的失真百分比)。

+0

謝謝你,這是非常有幫助的。你認爲'相機校準'是否必要/值得嗎? –

+0

@ user968243:我相信OpenCV的相機校準是爲了測量失真,所以它幾乎就是答案最後一段提到的內容。它的實用性取決於鏡頭的失真水平,我不知道。 –

+0

答案只是一階近似。通過校準相機,您可以輕鬆獲得更準確的答案。對於廣角鏡頭(> 90度FOV)尤其如此,這通常表現出明顯的非線性失真。 –

11

配方:

1 - 校準照相機,獲得所述照相機矩陣K和失真參數D.在本OpenCV的如在本描述tutorial完成。

2 - 從感興趣像素位置取出非線性失真。在OpenCV中,使用undistortPoints例程完成,無需傳遞參數R和P.

3 - 在攝像機3D座標中將感興趣的像素反投影爲光線(單位向量,尾部位於相機中心)齊次座標中的像素位置乘以相機矩陣的倒數。

4 - 你想要的角度相關聯的相機的焦軸的上述載體和(0,0,1)時,向量之間的角度。

+0

嗨,我想從像素P位置獲得軸承矢量。這是一個單位矢量,從相機中心到由像素P標識的對象。 要做到這一點,我應該到達您的描述的第3點。 camera_matrix是3x3矩陣,例如來自相機的校準。是對的嗎? 提前致謝 – kalmanIsAGameChanger