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