<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于OpenCV的單目攝像機(jī)測(cè)距

          共 3752字,需瀏覽 8分鐘

           ·

          2021-04-25 10:23

          點(diǎn)擊上方小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          本文轉(zhuǎn)自|新機(jī)器視覺

          我的論文方向目前是使用單目攝像頭實(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è)距,簡(jiǎn)單來說就是將原來的讀入照片變?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))

          改為:

          1. box = cv2.boxPoints(marker)

          2. box = np.int0(box)

          存在的問題:

          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 <module>
              marker = find_marker(frame)
            File "video_paper_distance.py", line 18, in find_marker
              c = max(cnts, key = cv2.contourArea)

          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)人來獲取其在圖像中的高度。


           End 


          下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
          在「小白學(xué)視覺」公眾號(hào)后臺(tái)回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。

          下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測(cè)、車道線檢測(cè)、車輛計(jì)數(shù)、添加眼線、車牌識(shí)別、字符識(shí)別、情緒檢測(cè)、文本內(nèi)容提取、面部識(shí)別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。

          下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講
          小白學(xué)視覺公眾號(hào)后臺(tái)回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。

          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請(qǐng)按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


          瀏覽 84
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  慢慢操一区二区 | 日本素人在线 | 欧美日韩中文字 | 国产一区二区三区乱伦 | 啊啊啊男女拍拍视频 |