0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用python和opencv實(shí)現(xiàn)單目攝像機(jī)測(cè)距

新機(jī)器視覺 ? 來源:CSDN博主O98K ? 2023-07-03 10:01 ? 次閱讀

我的論文方向目前是使用單目攝像頭實(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攝像頭,這樣的效果看起來比較直觀.源程序如下:

86b785b0-18dd-11ee-962d-dac502259ad0.jpg

在這張圖里我攝像頭距離桌面大概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 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è):

870e4472-18dd-11ee-962d-dac502259ad0.jpg

2.將行人檢測(cè)與測(cè)距代碼結(jié)合:

875b3444-18dd-11ee-962d-dac502259ad0.png

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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bà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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    網(wǎng)絡(luò)攝像機(jī)是什么?

    (http://www.ztwl.cn/)網(wǎng)絡(luò)攝像機(jī)網(wǎng)絡(luò)攝像機(jī)就是擁有獨(dú)立的IP地址和嵌入式的操作系統(tǒng)從而實(shí)現(xiàn)網(wǎng)絡(luò)監(jiān)控的智能化產(chǎn)品。輕此又被叫做IP 攝像機(jī)或IP CAMERA。 它可
    發(fā)表于 05-26 09:57

    攝像機(jī)同步方式

    ,是利用攝像機(jī)的交流電源來完成垂直推動(dòng)同步,即攝像機(jī)和電源零線同步?! ≤囕dDVR外同步(EXT)利用一個(gè)外同步信號(hào)發(fā)生器產(chǎn)生的同步信號(hào)送到攝像機(jī)的外同步輸入端來實(shí)現(xiàn)同步?! ⊥叫盘?hào)
    發(fā)表于 03-04 11:04

    一個(gè)VS+OpenCV編寫的攝像機(jī)采集圖像的小程序

    這個(gè)程序是在VS2013下編寫的,用OpenCv3.00的平臺(tái),攝像機(jī)是大恒的HV1351UM,只實(shí)現(xiàn)了圖像的采集,并沒有圖像處理的功能在里面。
    發(fā)表于 03-21 21:07

    網(wǎng)絡(luò)攝像機(jī)與模擬攝像機(jī)的區(qū)別是什么

    ,另外還可以通過網(wǎng)絡(luò)來控制攝像機(jī)的云臺(tái)和鏡頭,進(jìn)行全方位地監(jiān)控?! ∮霉叫蜗蟊硎救缦拢篒P Camera=路DVS+Camera  其次,性能大不同:  第一、清晰度??吹酶迨敲總€(gè)用戶追求的目標(biāo)
    發(fā)表于 12-11 14:22

    用于網(wǎng)絡(luò)攝像機(jī)\監(jiān)控攝像機(jī)鏡頭驅(qū)動(dòng)芯片MS41918M-頌揚(yáng)恒科技

    MS41918M是瑞盟科技推出的一款用于網(wǎng)絡(luò)攝像機(jī)和監(jiān)控攝像機(jī)的鏡頭驅(qū)動(dòng)片。芯片內(nèi)置光圈控制功能;通過電壓驅(qū)動(dòng)方式以及扭矩紋波修正技術(shù),實(shí)現(xiàn)了超低噪聲微步驅(qū)動(dòng)。主要特點(diǎn):■電壓驅(qū)動(dòng)方式,256 微步
    發(fā)表于 10-21 11:32

    基于攝像機(jī)的運(yùn)動(dòng)員姿態(tài)計(jì)算

    運(yùn)動(dòng)員姿態(tài)的計(jì)算是非常困難的并且有很多應(yīng)用。在本文中,我們主要針對(duì)運(yùn)動(dòng)員身體傾角,提出了一種基于攝像機(jī)的幾何計(jì)算方法。首先,利用針孔模型對(duì)場(chǎng)景進(jìn)行3d 重建
    發(fā)表于 08-12 08:41 ?9次下載

    CCD 攝像機(jī)質(zhì)量對(duì)網(wǎng)絡(luò)攝像機(jī)的影響

    CCD 攝像機(jī)質(zhì)量對(duì)網(wǎng)絡(luò)攝像機(jī)的影響提要:網(wǎng)絡(luò)攝象機(jī) ( 網(wǎng)絡(luò)攝象服務(wù)器、視頻服務(wù)器、網(wǎng)絡(luò)視頻轉(zhuǎn)換器等 ) 采用的 CCD 攝像機(jī)的質(zhì)量對(duì)帶寬的影響很大,采用優(yōu)質(zhì)
    發(fā)表于 12-29 11:23 ?743次閱讀

    網(wǎng)絡(luò)攝像機(jī)

    網(wǎng)絡(luò)攝像機(jī)   網(wǎng)絡(luò)攝像機(jī)是一種結(jié)合傳統(tǒng)攝像機(jī)與網(wǎng)絡(luò)技術(shù)所產(chǎn)生的新一代攝像機(jī),它
    發(fā)表于 01-07 10:17 ?866次閱讀

    基于攝像機(jī)的電力設(shè)施侵入目標(biāo)參數(shù)計(jì)算

    基于攝像機(jī)成像的電力設(shè)施侵入目標(biāo)的參數(shù)計(jì)算,首先采用成本較低的攝像機(jī)目視覺系統(tǒng),對(duì)攝像機(jī)監(jiān)
    發(fā)表于 07-16 16:57 ?33次下載

    基于OpenCV攝像機(jī)標(biāo)定

    本文CameraCalibrator類源代碼來自于OpenCV2 計(jì)算機(jī)視覺編程手冊(cè)(Robert Laganiere 著 張靜 譯) 強(qiáng)烈建議閱讀機(jī)器視覺學(xué)習(xí)筆記(4)——攝像機(jī)
    發(fā)表于 02-08 03:36 ?802次閱讀

    基于OpenCV的雙目攝像機(jī)標(biāo)定

    )——攝像機(jī)標(biāo)定參數(shù)說明? 機(jī)器視覺學(xué)習(xí)筆記(5)——基于OpenCV
    發(fā)表于 02-08 03:41 ?726次閱讀

    opencv相機(jī)標(biāo)定例程

    可選參數(shù)進(jìn)行攝像機(jī)標(biāo)定的程序。calibration_artificial.cpp 是程序模擬模擬攝像機(jī)標(biāo)定的過程,即程序創(chuàng)建棋盤然后自主標(biāo)定。
    發(fā)表于 12-04 17:23 ?3624次閱讀
    <b class='flag-5'>opencv</b><b class='flag-5'>單</b><b class='flag-5'>目</b>相機(jī)標(biāo)定例程

    網(wǎng)絡(luò)攝像機(jī)和模擬攝像機(jī)_數(shù)字攝像機(jī)的區(qū)別分析

    數(shù)字攝像機(jī)包括目前市場(chǎng)上主流的有三種產(chǎn)品:網(wǎng)絡(luò)攝像機(jī),SDI攝像機(jī),網(wǎng)線通攝像機(jī)。網(wǎng)絡(luò)高清攝像機(jī)主要由視頻采集、視頻編碼、網(wǎng)絡(luò)傳輸?shù)葞撞糠纸M
    發(fā)表于 01-02 15:39 ?9690次閱讀

    RFID技術(shù)融入攝像機(jī) 實(shí)現(xiàn)智能視頻監(jiān)控

    和視頻分析技術(shù)的應(yīng)用,從而實(shí)現(xiàn)智能視頻監(jiān)控。因此融入RFID技術(shù)的攝像機(jī)應(yīng)運(yùn)而生,為攝像機(jī)插上感知的翅膀,使攝像機(jī)耳聰明。
    發(fā)表于 11-25 10:42 ?3924次閱讀

    opencv-pythonopencv一樣嗎

    不一樣。OpenCV(Open Source Computer Vision Library)是一個(gè)開源的計(jì)算機(jī)視覺和機(jī)器學(xué)習(xí)軟件庫,它提供了大量的圖像和視頻處理功能。OpenCV-Python
    的頭像 發(fā)表于 07-16 10:38 ?879次閱讀