<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用python和opencv實現單目攝像機測距

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

我的論文方向目前是使用單目攝像頭實現機器人對人的跟隨,首先單目攝像頭與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是攝像機焦距。

在原文中,是通過預先拍照,根據第一張照片算出攝像頭的焦距,在根據已知的焦距算出接下來的照片中白紙到攝像機的距離,這樣不太直觀,而且需要預先拍照,我將源程序改為實時測距,簡單來說就是將原來的讀入照片變為讀攝像頭,這樣的效果看起來比較直觀.源程序如下:

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

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

目前關于這個錯誤,我還沒有解決,猜測主要是由于沒有檢測到目標造成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進行行人檢測:

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

2.將行人檢測與測距代碼結合:

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

3.存在的問題:

目前使用HOG檢測行人的效果不是很好,會把類似人體形狀的物體都框出來,比如實驗室的三腳架等物體,受背景干擾較大。程序中存在一個bug就是在沒有檢測到人時,pix_person_height會為0,這樣分母為0時無法計算,在接下來我也要通過3個方面改進,首先要想辦法進一步改進人體檢測,使用YOLO的方法目前是比較好的,但在CPU下速度較慢。然后要改進的是精度,這里需要主要的是選擇攝像頭要選擇固定焦距的攝像頭,自動變焦攝像頭焦距會變化,測量的距離也會變。最后就是盡可能完善程序,減少bug。

4 . 將要進行的工作

通過程序可以看到使用單目攝像頭檢測人到攝像頭的距離,其中一個影響較大的因素是對人體的準確檢測,如果想要使測量的距離準確(完全準確是不可能的,但要達到可以用于機器人跟隨人的功能的程度),那就要盡可能的準確的檢測出人,通過我的測試,在準確知道目標人的身高前提下,在離攝像頭固定距離上對人拍照,然后手動對人進行畫框,標定出目標人的在畫面中的高度,通過計算,得到的距離比較準確,其精度完全是可以接受的,所以接下來的工作主要是如何通過程序來準確的框出目標人來獲取其在圖像中的高度。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 機器人
    +關注

    關注

    206

    文章

    27231

    瀏覽量

    201855
  • 攝像頭
    +關注

    關注

    59

    文章

    4676

    瀏覽量

    93237
  • 相機
    +關注

    關注

    4

    文章

    1261

    瀏覽量

    52660
  • OpenCV
    +關注

    關注

    29

    文章

    612

    瀏覽量

    40851
  • python
    +關注

    關注

    52

    文章

    4697

    瀏覽量

    83591

原文標題:單目攝像機測距(python+opencv)

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    CCD攝像機選購技巧

    來保證視頻信號的同步,它可保證不同的設備輸出的視頻信號具有相同的幀、行的起止時間。為了實現外同步,需要給攝像機輸入一個復合同步信號(C-sync)或復合視頻信號。外同步并不能保證用戶從指定時刻得到完整
    發表于 06-16 15:10

    彩色攝像機功能分析與應用

    CCD彩色攝像機的可調整功能 :(1)同步方式的選擇A、對臺彩色攝像機而言,主要的同步方式有下列三種:內同步——利用彩色攝像機內部的晶體振蕩電路產生同步信號來完成操作。外同步——利用
    發表于 08-18 15:42

    紅外攝像機技術原理圖解

    特殊的熱紅外夜視儀可以實現夜間監控。但這種特殊的熱紅外夜視儀造價昂貴,而且不能直觀、清晰地反映周圍環境狀況,因此在通常的夜視系統中較少被采用。 主動紅外攝像機技術,即利用紅外燈來產生紅外輻射,發出
    發表于 08-26 10:21

    監控攝像機的同步方式選擇法

         對臺監控攝像機而言,主要的同步方式有下列三種: 內同步--利用監控攝像機內部的晶體振蕩電路產生同步信號來完成操作
    發表于 10-06 16:44

    網絡攝像機是什么意思

    網絡攝像機 是一種結合傳統攝像機與網絡技術所產生的新一代攝像機,它可以將影像通過網絡傳至有網絡連接端口的另一端,且遠端的瀏覽者不需用任何專業軟件,只要標準的網絡瀏覽器(如“Microsoft IE或
    發表于 12-29 14:11

    深入了解紅外攝像機

    發出的紅外光較強,其它物體發出的紅外光很微弱,利用特殊的紅外攝像機可以實現夜間監控。但這種特殊的紅外攝像機造價昂貴,而且不能反映周圍環境狀況,因此在夜視系統中不被采用?!   ≈鲃蛹t外攝像
    發表于 02-05 15:46

    網絡攝像機是什么?

    (http://www.ztwl.cn/)網絡攝像機網絡攝像機就是擁有獨立的IP地址和嵌入式的操作系統從而實現網絡監控的智能化產品。輕此又被叫做IP 攝像機或IP CAMERA。 它可
    發表于 05-26 09:57

    [原創]淺談監控攝像機的技術原理與應用

    摘要:主要介紹低照度監控攝像機的技術原理、應用等,對比低照度監控攝像機與紅外攝像機的異同。當今,大眾對監控產品要求越來越高,不僅要實現全天候24小時監控,還要在照明條件不足的情況下呈現
    發表于 06-30 11:12

    攝像機同步方式

    ,是利用攝像機的交流電源來完成垂直推動同步,即攝像機和電源零線同步?! ≤囕dDVR外同步(EXT)利用一個外同步信號發生器產生的同步信號送到攝像機的外同步輸入端來實現同步?! ⊥叫盘?/div>
    發表于 03-04 11:04

    一個VS+OpenCV編寫的攝像機采集圖像的小程序

    這個程序是在VS2013下編寫的,用OpenCv3.00的平臺,攝像機是大恒的HV1351UM,只實現了圖像的采集,并沒有圖像處理的功能在里面。
    發表于 03-21 21:07

    網絡攝像機與模擬攝像機的區別是什么

    ,另外還可以通過網絡來控制攝像機的云臺和鏡頭,進行全方位地監控?! ∮霉叫蜗蟊硎救缦拢篒P Camera=路DVS+Camera  其次,性能大不同:  第一、清晰度??吹酶迨敲總€用戶追求的目標
    發表于 12-11 14:22

    用于網絡攝像機\監控攝像機鏡頭驅動芯片MS41918M-頌揚恒科技

    MS41918M是瑞盟科技推出的一款用于網絡攝像機和監控攝像機的鏡頭驅動片。芯片內置光圈控制功能;通過電壓驅動方式以及扭矩紋波修正技術,實現了超低噪聲微步驅動。主要特點:■電壓驅動方式,256 微步
    發表于 10-21 11:32

    LabVIEW+Python+openCV

    的,動態鏈接庫也需要配置,還需要知道各個參數含義和類型,這里提供另外一種方法,那就是PythonopenCV工具包,絕對開源和免費,LabVIEW可以利用Python節點調用Python
    發表于 12-07 20:59

    基于OpenCV的單目攝像機標定

    本文CameraCalibrator類源代碼來自于OpenCV2 計算機視覺編程手冊(Robert Laganiere 著 張靜 譯) 強烈建議閱讀機器視覺學習筆記(4)——單目攝像機標定參數
    發表于 02-08 03:36 ?587次閱讀

    基于OpenCV的雙目攝像機標定

    (4)——單目攝像機標定參數說明? 機器視覺學習筆記(5)——基于OpenCV的單目攝像機標定? 機器視覺學習筆記(6)——雙目攝像機標定參數說明 1.雙目
    發表于 02-08 03:41 ?628次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>