日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

opencv 通过网络连接工业相机_单目摄像机测距(python+opencv)

發(fā)布時間:2025/3/15 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv 通过网络连接工业相机_单目摄像机测距(python+opencv) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊上方“新機器視覺”,選擇加"星標"或“置頂”

重磅干貨,第一時間送達

? 我的論文方向目前是使用單目攝像頭實現(xiàn)機器人對人的跟隨,首先單目攝像頭與kinect等深度攝像頭最大的區(qū)別是無法有效獲取深度信息,那就首先從這方面入手,嘗試通過圖像獲取攝像頭與人的距離。

??????? 在網(wǎng)上看了幾天關(guān)于攝像頭標定和攝像頭焦距等原理的文章,然后通過這篇文章真正啟發(fā)了我:用python和opencv來測量目標到相機的距離??主要的測距的原理是利用相似三角形計算物體到相機的距離。

在這里我的環(huán)境為: Ubuntu14.04 + Opencv2.4.9

一 用相似三角形計算物體或者目標到相機的距離

我們將使用相似三角形來計算相機到一個已知的物體或者目標的距離。

相似三角形就是這么一回事:假設(shè)我們有一個寬度為 W 的目標或者物體。然后我們將這個目標放在距離我們的相機為 D 的位置。我們用相機對物體進行拍照并且測量物體的像素寬度 P 。這樣我們就得出了相機焦距的公式:

F = (P x D) / W

舉個例子,假設(shè)我在離相機距離 D = 24 英寸的地方放一張標準的 8.5 x 11 英寸的 A4 紙(橫著放;W = 11)并且拍下一張照片。我測量出照片中 A4 紙的像素寬度為 P = 249 像素。

因此我的焦距 F 是:

F = (248px x 24in) / 11in = 543.45

當我繼續(xù)將我的相機移動靠近或者離遠物體或者目標時,我可以用相似三角形來計算出物體離相機的距離:

D’ = (W x F) / P

為了更具體,我們再舉個例子,假設(shè)我將相機移到距離目標 3 英尺(或者說 36 英寸)的地方并且拍下上述的 A4 紙。通過自動的圖形處理我可以獲得圖片中 A4 紙的像素距離為 170 像素。將這個代入公式得:

D’ = (11in x 543.45) / 170 = 35 英寸

或者約 36 英寸,合 3 英尺。

從以上的解釋中,我們可以看到,要想得到距離,我們就要知道攝像頭的焦距和目標物體的尺寸大小,這兩個已知條件根據(jù)公式:  

D’ = (W x F) / P 

得出目標到攝像機的距離D,其中P是指像素距離,W是A4紙的寬度,F是攝像機焦距。

  在原文中,是通過預先拍照,根據(jù)第一張照片算出攝像頭的焦距,在根據(jù)已知的焦距算出接下來的照片中白紙到攝像機的距離,這樣不太直觀,而且需要預先拍照,我將源程序改為實時測距,簡單來說就是將原來的讀入照片變?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)

因為 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

目前關(guān)于這個錯誤,我還沒有解決,猜測主要是由于沒有檢測到目標造成max()函數(shù)為空的原因,不過沒有深究。

2. 程序是通過第一張圖已知目標到相機的距離來計算攝像頭焦距,然后再通過焦距計算接下來目標到攝像頭的距離,在這里焦距是一個關(guān)鍵的參數(shù),所以我準備嘗試通過對攝像頭的標定直接獲取相機的像素焦距,我是通過ros的一個包實現(xiàn)了對相機的標定,不過通過相機標定得出的像素焦距計算出來的距離并沒有通過第一張圖片計算出的焦距計算出來的距離準確,這個具體原因也沒有搞明白,可能是我標定的結(jié)果不夠準確?

3. 在通過攝像頭測距時, 得出的距離也是準確且隨著攝像頭距離桌面遠近而線性變化的,但距離偶爾會出現(xiàn)突變,目前也沒找到是什么原因造成的.

ros相機標定主要參考的是這篇博客,博主是白巧克力亦唯心,ROS大神:

ROS 教程之 vision: 攝像頭標定camera calibration

這里主要記錄的是,通過攝像機標定,得到的3*3的內(nèi)參數(shù)矩陣,其中M[1][1]和M[2][2]分別為我們要求的相機的x,y軸的像素焦距。

二 使用相機計算人到相機的距離

  在第一部分中我們已經(jīng)計算出了A4紙距離相機的距離,在具體應用中,我需要計算的是人距離相機的距離,來實現(xiàn)機器人對目標人距離的判斷,應用與對目標人的跟隨。在這里主要的思路是先通過opencv中的HOG方法檢測到人,再根據(jù)人的預估身高和攝像頭焦距計算人到攝像機的距離。在這里選擇身高的原因在于人的身高在不同方向上變化較小,而且我們的攝像頭高度是固定的,所以選擇身高。

1.首先要使用opencv進行行人檢測:

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

3.存在的問題:

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

4 . 將要進行的工作

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

作者為CSDN博主O98K

鏈接https://blog.csdn.net/m0_37811342/article/details/80394935

?End?

聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學習、交流之目的。文章版權(quán)歸原作者所有。如有不妥,請聯(lián)系刪除。

總結(jié)

以上是生活随笔為你收集整理的opencv 通过网络连接工业相机_单目摄像机测距(python+opencv)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。