我的論文方向目前是使用單目攝像頭實現機器人對人的跟隨,首先單目攝像頭與kinect等深度攝像頭最大的區別是無法有效獲取深度信息,那就首先從這方面入手,嘗試通過圖像獲取攝像頭與人的距離。
在網上看了幾天關于攝像頭標定和攝像頭焦距等原理的文章,然后通過這篇文章真正啟發了我:用python和opencv來測量目標到相機的距離主要的測距的原理是利用相似三角形計算物體到相機的距離。
在這里我的環境為: Ubuntu14.04 + Opencv2.4.9
一用相似三角形計算物體或者目標到相機的距離
我們將使用相似三角形來計算相機到一個已知的物體或者目標的距離。
相似三角形就是這么一回事:假設我們有一個寬度為 W 的目標或者物體。然后我們將這個目標放在距離我們的相機為 D 的位置。我們用相機對物體進行拍照并且測量物體的像素寬度 P 。這樣我們就得出了相機焦距的公式:
F = (P x D) / W
舉個例子,假設我在離相機距離 D = 24 英寸的地方放一張標準的 8.5 x 11 英寸的 A4 紙(橫著放;W = 11)并且拍下一張照片。我測量出照片中 A4 紙的像素寬度為 P = 249 像素。
因此我的焦距 F 是:
F = (248px x 24in) / 11in = 543.45
當我繼續將我的相機移動靠近或者離遠物體或者目標時,我可以用相似三角形來計算出物體離相機的距離:
D’ = (W x F) / P
為了更具體,我們再舉個例子,假設我將相機移到距離目標 3 英尺(或者說 36 英寸)的地方并且拍下上述的 A4 紙。通過自動的圖形處理我可以獲得圖片中 A4 紙的像素距離為 170 像素。將這個代入公式得:
D’ = (11in x 543.45) / 170 = 35 英寸
或者約 36 英寸,合 3 英尺。
從以上的解釋中,我們可以看到,要想得到距離,我們就要知道攝像頭的焦距和目標物體的尺寸大小,這兩個已知條件根據公式:
D’ = (W x F) / P
得出目標到攝像機的距離D,其中P是指像素距離,W是A4紙的寬度,F是攝像機焦距。
在原文中,是通過預先拍照,根據第一張照片算出攝像頭的焦距,在根據已知的焦距算出接下來的照片中白紙到攝像機的距離,這樣不太直觀,而且需要預先拍照,我將源程序改為實時測距,簡單來說就是將原來的讀入照片變為讀攝像頭,這樣的效果看起來比較直觀.源程序如下:
在這張圖里我攝像頭距離桌面大概100cm,可以看到圖中距離為96cm,可以看到精度還可以。
需要注意的是, 如果使用的是opencv3的版本,
1. 需要將find_marker函數中
(cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
改為:
(_, cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
因為 In Opencv 3 API version the cv2.findCoutours()returns 3 object
image
contours
hierarchy
2. 需要將:
box = np.int0(cv2.cv.BoxPoints(marker))
改為:
box = cv2.boxPoints(marker)
box = np.int0(box)
以上兩個地方是安裝不同版本opencv需要修改的地方。
存在的問題:
1. 程序在運行時在未檢測到A4紙時有時候會報錯:
Traceback (most recent call last): File "video_paper_distance.py", line 86, in
ValueError: max() arg is an empty sequence
目前關于這個錯誤,我還沒有解決,猜測主要是由于沒有檢測到目標造成max()函數為空的原因,不過沒有深究。
2. 程序是通過第一張圖已知目標到相機的距離來計算攝像頭焦距,然后再通過焦距計算接下來目標到攝像頭的距離,在這里焦距是一個關鍵的參數,所以我準備嘗試通過對攝像頭的標定直接獲取相機的像素焦距,我是通過ros的一個包實現了對相機的標定,不過通過相機標定得出的像素焦距計算出來的距離并沒有通過第一張圖片計算出的焦距計算出來的距離準確,這個具體原因也沒有搞明白,可能是我標定的結果不夠準確?
3. 在通過攝像頭測距時, 得出的距離也是準確且隨著攝像頭距離桌面遠近而線性變化的,但距離偶爾會出現突變,目前也沒找到是什么原因造成的.
ros相機標定主要參考的是這篇博客,博主是白巧克力亦唯心,ROS大神:
ROS 教程之 vision: 攝像頭標定camera calibration
這里主要記錄的是,通過攝像機標定,得到的3*3的內參數矩陣,其中M[1][1]和M[2][2]分別為我們要求的相機的x,y軸的像素焦距。
二使用相機計算人到相機的距離
在第一部分中我們已經計算出了A4紙距離相機的距離,在具體應用中,我需要計算的是人距離相機的距離,來實現機器人對目標人距離的判斷,應用與對目標人的跟隨。在這里主要的思路是先通過opencv中的HOG方法檢測到人,再根據人的預估身高和攝像頭焦距計算人到攝像機的距離。在這里選擇身高的原因在于人的身高在不同方向上變化較小,而且我們的攝像頭高度是固定的,所以選擇身高。
1.首先要使用opencv進行行人檢測:
2.將行人檢測與測距代碼結合:
3.存在的問題:
目前使用HOG檢測行人的效果不是很好,會把類似人體形狀的物體都框出來,比如實驗室的三腳架等物體,受背景干擾較大。程序中存在一個bug就是在沒有檢測到人時,pix_person_height會為0,這樣分母為0時無法計算,在接下來我也要通過3個方面改進,首先要想辦法進一步改進人體檢測,使用YOLO的方法目前是比較好的,但在CPU下速度較慢。然后要改進的是精度,這里需要主要的是選擇攝像頭要選擇固定焦距的攝像頭,自動變焦攝像頭焦距會變化,測量的距離也會變。最后就是盡可能完善程序,減少bug。
4 . 將要進行的工作
通過程序可以看到使用單目攝像頭檢測人到攝像頭的距離,其中一個影響較大的因素是對人體的準確檢測,如果想要使測量的距離準確(完全準確是不可能的,但要達到可以用于機器人跟隨人的功能的程度),那就要盡可能的準確的檢測出人,通過我的測試,在準確知道目標人的身高前提下,在離攝像頭固定距離上對人拍照,然后手動對人進行畫框,標定出目標人的在畫面中的高度,通過計算,得到的距離比較準確,其精度完全是可以接受的,所以接下來的工作主要是如何通過程序來準確的框出目標人來獲取其在圖像中的高度。
審核編輯:湯梓紅
-
機器人
+關注
關注
211文章
28640瀏覽量
208395 -
攝像頭
+關注
關注
60文章
4862瀏覽量
96298 -
相機
+關注
關注
4文章
1367瀏覽量
53913 -
OpenCV
+關注
關注
31文章
635瀏覽量
41555 -
python
+關注
關注
56文章
4807瀏覽量
85037
原文標題:單目攝像機測距(python+opencv)
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論