女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

3天內不再提示

如何用Python和OpenCV來測量相機到目標的距離

新機器視覺 ? 來源:CSDN技術社區 ? 作者:jolingcome ? 2021-05-20 15:15 ? 次閱讀

英文:Adrian Rosebrock 編譯:伯樂在線-G.K.

http://python.jobbole.com/84378/

幾天前,一個叫 Cameron 的 PyImageSearch 讀者發來郵件詢問攝像頭測距的方法。他花了一些時間研究,但是沒有找到解決辦法。

我很能體會 Cameron 的感受。幾年前我做過一個分析棒球離手飛向本壘的運動的小項目。

我通過使用運動分析和基于軌跡的跟蹤方法來確定或者估計小球在視頻幀中的位置。并且因為棒球的大小是已知的,所以我也能估計出其到本壘的距離。

那是個有趣的項目,雖然系統的精度沒有達到我的預期。——棒球運動太快所造成的“運動模糊”讓達到高精度變得十分困難。

我的項目完全算是一個個例,但是通常來說,在計算機視覺或者圖形處理領域計算從相機到目標的距離實際上是一個非常容易的問題。你可以找到一個像三角形相似這樣簡單粗暴的方法,或者你也可以用上相機模型的內參這樣更復雜一點(但是更精確)的方法。

在這篇博客,我將會告訴大家我和 Cameron 是如果解決這個計算相機到已知物體或目標的距離。

千萬要看——你一定不想錯過。

OpenCV 和 Python 版本:這個例子可以在Python 2.7/Python 3.4+和OpenCV 2.4.X上運行。

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

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

相似三角形就是這么一回事:假設我們有一個寬度為 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 英尺。

注意:當我給這次例子拍照時,我的卷尺有一點松,因此結果造成了大約 1 英寸的誤差。還有我也是很快速地拍下了照片并且沒有完全對齊卷尺上的腳標,這也會對最終結果的 1 英寸誤差產生影響。綜上所述,相似三角形的方法還是合理的,你也可以用這個方法很簡單地計算出物體或者目標距離你的相機的距離。

現在理解了?

太棒了。接下來讓我們用一些代碼來看看如何用 Python、OpenCV、圖像處理和計算機視覺技術來獲得相機到物體或者目標的距離。

用Python和OpenCV來測量相機到目標的距離

繼續,我們開始這個項目。打開一個文件,命名為distance_to_camera.py,然后就可以開工了。

# import the necessary packages

importnumpyasnp

importcv2

deffind_marker(image):

# convert the image to grayscale, blur it, and detect edges

gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

gray=cv2.GaussianBlur(gray,(5,5),0)

edged=cv2.Canny(gray,35,125)

# find the contours in the edged image and keep the largest one;

# we'll assume that this is our piece of paper in the image

(cnts,_)=cv2.findContours(edged.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

c=max(cnts,key=cv2.contourArea)

# compute the bounding box of the of the paper region and return it

returncv2.minAreaRect(c)

第一件要做的事情就是導入必要的包。我們將用NumPy來進行數值計算和cv2來綁定 OpenCV 。

在那之后我們定義find_marker函數。這個函數接收一個image參數,并且這意味著我們將用它來找出將要計算距離的物體。

在這個例子中我們使用標準的 8.5 x 11 英寸的 A4 紙作為我們的目標。

目前我們的第一個任務是找出圖像中的這張紙。

我們先將圖像轉成灰度圖,用高斯模糊除去明顯的噪點,并且在第7-9 行使用邊緣檢測。

完成這幾步后,我們的圖像應該長這樣:

13e2fc3a-b4a9-11eb-bf61-12bb97331649.jpg

如你所見,我們的目標(A4 紙)的邊緣已經很清晰了。現在我們只要找出這張紙的輪廓(比如:外形)。

我們用13 行的cv2.findContours函數找到目標,并且在14 行計算出面積最大的輪廓。

我們假設面積最大的輪廓是我們的那張 A4 紙。這個假設在我們的這個例子是成立的,但是實際上在圖像中找出目標是和是與應用場景高度相關的。

在我們的例子中,簡單的邊緣檢測和計算最大的輪廓是可行的。我們可以通過使用輪廓近似法使系統更具魯棒性,排除不包含有4個頂點的輪廓(因為 A4 紙是矩形有四個頂點),然后計算面積最大的四點輪廓。

注意:更多這樣的方法見這篇文章,講述了如何做一個簡單粗暴的手機掃描儀。

其他找到圖像中目標可選的方法是利用顏色特征(目標的顏色和背景有著明顯的不同)。你還可以使用關鍵點檢測,局部不變性描述子,和關鍵點匹配來尋找目標。但是這些方法以及超出了這篇文章的范疇,并且具有高度定制化的特性。

不管怎樣,我們現在獲得了目標的輪廓,并且在第17 行返回包含(x, y)坐標和像素高度和寬度信息的邊界框給調用函數。

讓我們也快速定義一個用上述的相似三角形法計算距離的函數:

defdistance_to_camera(knownWidth,focalLength,perWidth):

# compute and return the distance from the maker to the camera

return(knownWidth*focalLength)/perWidth

這個函數傳入目標的knownWidth,計算好的focalLength,和目標在圖像中的像素距離,并且使用上面推導的相似三角形公式來計算到物體的距離。

繼續讀下列代碼來看看我們是如何利用這些函數的:

#import the necessary packages

importnumpyasnp

importcv2

deffind_marker(image):

# convert the image to grayscale, blur it, and detect edges

gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

gray=cv2.GaussianBlur(gray,(5,5),0)

edged=cv2.Canny(gray,35,125)

# find the contours in the edged image and keep the largest one;

# we'll assume that this is our piece of paper in the image

(cnts,_)=cv2.findContours(edged.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

c=max(cnts,key=cv2.contourArea)

# compute the bounding box of the of the paper region and return it

returncv2.minAreaRect(c)

defdistance_to_camera(knownWidth,focalLength,perWidth):

# compute and return the distance from the maker to the camera

return(knownWidth*focalLength)/perWidth

# initialize the known distance from the camera to the object, which

# in this case is 24 inches

KNOWN_DISTANCE=24.0

# initialize the known object width, which in this case, the piece of

# paper is 11 inches wide

KNOWN_WIDTH=11.0

# initialize the list of images that we'll be using

IMAGE_PATHS=["images/2ft.png","images/3ft.png","images/4ft.png"]

# load the furst image that contains an object that is KNOWN TO BE 2 feet

# from our camera, then find the paper marker in the image, and initialize

# the focal length

image=cv2.imread(IMAGE_PATHS[0])

marker=find_marker(image)

focalLength=(marker[1][0]*KNOWN_DISTANCE)/KNOWN_WIDTH

找到圖像中目標的距離的第一步是標定和計算焦距。我們需要知道以下參數:

相機到物體的距離

這個物體的寬度(單位英尺或米)。注意:也可以用高度,這個例子中我們使用寬度。

這里不得不提示一下我們所做的并不是實質意義上的攝像機標定。真正的攝像機標定包括攝像機的內參,你可以從這里獲得更多相關知識。

在第25 行我們初始化了已知的KNOWN_DISTANCE,從相機到物體的距離為 24 英寸。在第29 行我們初始了物體的寬度KNOWN_WIDTH為 11 英寸(一張橫著放的標準 A4 紙)。

然后我們在第32 行定義要用到的圖片的路徑。

下一步比較重要:是一個簡單的標定。

第37 行從硬盤讀取第一張圖,——我們將用這張圖來作為標定圖片。

圖片加載以后,在第38 行計算圖中 A4 紙的輪廓信息,在第39 行使用三角形相似法計算出focalLength。

由于我們已經“標定”了我們的系統并且獲得了focalLength,我們可以很容易地計算出相機離接下來圖片中目標的距離。

讓我們看看這個是這么做的:

41# loop over the images

42forimagePathinIMAGE_PATHS:

# load the image, find the marker in the image, then compute the

# distance to the marker from the camera

image=cv2.imread(imagePath)

46marker=find_marker(image)

47inches=distance_to_camera(KNOWN_WIDTH,focalLength,marker[1][0])

# draw a bounding box around the image and display it

box=np.int0(cv2.cv.BoxPoints(marker))

cv2.drawContours(image,[box],-1,(0,255,0),2)

cv2.putText(image,"%.2fft"%(inches/12),

(image.shape[1]-200,image.shape[0]-20),cv2.FONT_HERSHEY_SIMPLEX,

2.0,(0,255,0),3)

cv2.imshow("image",image)

cv2.waitKey(0)

在第42 行開始遍歷所有的圖片路徑。

然后,在第45 行我們將列表中所有的圖片從硬盤讀取下來。在第46 行提取目標輪廓,并且在第47 行計算攝像機到物體的距離。

在第50-56 行,我們簡單地畫出目標的邊框并且顯示出距離。

結果

來看看我們的腳本運作,打開一個終端,導航到你的代碼目錄,執行以下命令:

$pythondistance_to_camera.py

如果一切正常你將會看到2ft.png的結果,這張圖是用來“標定”我們的系統并且計算初始的focalLength:

從上面的圖片我們可以看到我們的焦距被正確地計算出來并且按照代碼中的變量KNOWN_DISTANCE和KNOWN_WIDTH,A4 紙的距離是 2 英尺。

現在我們有了焦距,我們可以在接下來的圖片中計算出目標的距離:

上上面的例子,我們的相機大概離目標有 3 英尺遠。

讓我們退后一步:

再次需要注意的是,我在拍這個例子的時候動作很快并且卷尺并沒有繃緊。而且,我也沒有確保我的相機是百分之百地對準目標底部,因此,這些例子總會有大概 1 英寸的誤差。

以上是我要說的,這篇文章描述的三角形相似法仍然可以用,并且能夠讓你測量出圖像上的物體或目標到你相機的距離。

總結

在這篇博客我們學習了如何計算一個圖像上的已知物體到相機的距離。

為了完成這個任務我們利用了三角形相似法,并且需要知道兩個重要的參數:

1、 目標的實際寬度(或高度),單位可以是英寸或者米。

2、 標定過程 1 中相機到目標的距離。

計算機視覺和圖像處理算法可以被用來自動檢測圖像中物體的像素寬度或高度并且完成相似三角形的計算,得出一個焦距。

然后在接下來的圖片中,我們只要提取出目標輪廓就可以利用得到的焦距測量出目標到相機的距離。

編輯:jq

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

    關注

    3

    文章

    1335

    瀏覽量

    58138
  • 圖像處理
    +關注

    關注

    27

    文章

    1324

    瀏覽量

    57692
  • 相機
    +關注

    關注

    4

    文章

    1430

    瀏覽量

    54473
  • 自動檢測
    +關注

    關注

    0

    文章

    119

    瀏覽量

    15916
  • 計算機視覺
    +關注

    關注

    9

    文章

    1706

    瀏覽量

    46561

原文標題:用 Python 和 OpenCV 來測量相機到目標的距離

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    何用OpenCV相機捕捉視頻進行人臉檢測--基于米爾NXP i.MX93開發板

    本文將介紹基于米爾電子MYD-LMX93開發板(米爾基于NXPi.MX93開發板)的基于OpenCV的人臉檢測方案測試。OpenCV提供了一個非常簡單的接口,用于相機捕捉一個視頻(我用的電腦內置
    的頭像 發表于 04-15 11:51 ?243次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>OpenCV</b>的<b class='flag-5'>相機</b>捕捉視頻進行人臉檢測--基于米爾NXP i.MX93開發板

    為LSDK構建opencv時遇到的問題求解

    我正在嘗試使用 flex-builder 運行 bld -c opencv -r ubuntu:桌面 我想要最新版本的 OpenCV。在我的 sdk.yml 文件中,我將 opencv
    發表于 03-26 08:26

    如何提高多攝像頭多目標Python演示的性能選項?

    Multi-Camera Multi-Target Python 演示中的_compute_mct_distance_matrixfunction可通過多個攝像頭檢查彼此之間對每條軌道的正弦距離。 大量的追蹤工作需要花費數小時
    發表于 03-06 06:48

    在ALC SDK中使用大恒相機不使用Point Grey的相機時需要做哪些修改呢?

    編譯嗎? 另外,3D Scanner的 config里有opencv相機type,但是選了這個也不行,TIDA-00254:這份文檔對opencv的部分也沒做詳細的介紹,用這個會不會更方便呢?
    發表于 03-03 08:03

    為什么由相機和投影儀構建三維測量系統時,相機的分辨率要是DMD分辨率的4倍? DLPDLCR3310最近工作距離是多少?

    工程師您好,有以下問題希望得到您的回復: 為什么由相機和投影儀構建三維測量系統時,相機的分辨率要是DMD分辨率的4倍? DLPDLCR3310的最近工作距離是多少?在實際投影時,在2
    發表于 02-18 08:33

    有沒有推薦的方法或流程校準AD7793,確保在100度200度之間的測量準確?

    我正在使用AD7793模數轉換器和K型熱電偶進行溫度測量目標是在100度200度的范圍內獲得精確讀數。當前使用的配置是1.17V的參考電壓和32的增益。 我遇到的主要問題是確定合適的轉換
    發表于 12-19 06:47

    【AI實戰項目】基于OpenCV的“顏色識別項目”完整操作過程

    適用于哪些場景,然后通過Python編寫代碼實現這些算法,并應用于實際項目中,實現圖像的檢測、識別、分類、定位、測量目標。華清遠見【python
    的頭像 發表于 12-09 16:42 ?1211次閱讀
    【AI實戰項目】基于<b class='flag-5'>OpenCV</b>的“顏色識別項目”完整操作過程

    一個月速成python+OpenCV圖像處理

    適用于哪些場景,然后通過Python編寫代碼實現這些算法,并應用于實際項目中,實現圖像的檢測、識別、分類、定位、測量目標。本文將介紹一個高效學習
    的頭像 發表于 11-29 18:27 ?386次閱讀
    一個月速成<b class='flag-5'>python+OpenCV</b>圖像處理

    何用OpenCV相機捕捉視頻進行人臉檢測--基于米爾NXP i.MX93開發板

    提供了一個非常簡單的接口,用于相機捕捉一個視頻(我用的電腦內置攝像頭) 1、安裝python3-opencv apt install python3-opencv 2、查看攝像頭支持的格式與分辨率
    發表于 11-15 17:58

    基于OPENCV相機捕捉視頻進行人臉檢測--米爾NXP i.MX93開發板

    本文將介紹基于米爾電子MYD-LMX93開發板(米爾基于NXPi.MX93開發板)的基于OpenCV的人臉檢測方案測試。OpenCV提供了一個非常簡單的接口,用于相機捕捉一個視頻(我用的電腦內置
    的頭像 發表于 11-07 09:03 ?1395次閱讀
    基于<b class='flag-5'>OPENCV</b>的<b class='flag-5'>相機</b>捕捉視頻進行人臉檢測--米爾NXP i.MX93開發板

    京朗仕特新一代的測量神奇——防爆激光測距儀YHJ-350J(A)

    快速測量出被測量目標的準確距離,成為目前比較流行測距方式,由于操作簡單測距精準快速等特點受到了很多朋友的青睞,特別是防爆激光測距儀YHJ-350J(A) 這一款,是能夠對
    的頭像 發表于 10-08 14:26 ?424次閱讀
    京朗仕特新一代的<b class='flag-5'>測量</b>神奇——防爆激光測距儀YHJ-350J(A)

    使用Python進行Ping測試

    )請求包,然后等待目標主機返回響應包,從而測量網絡的延遲和丟包情況。隨著Python編程語言的廣泛應用,越來越多的網絡工程師開始使用Python進行自動化網絡測試和管理任務。本篇文章將
    的頭像 發表于 08-12 17:56 ?886次閱讀
    使用<b class='flag-5'>Python</b>進行Ping測試

    opencv-pythonopencv一樣嗎

    OpenCV的一個Python語言接口,它允許開發者使用Python語言調用OpenCV庫的功能。 雖然
    的頭像 發表于 07-16 10:38 ?1915次閱讀

    opencv的主要功能有哪些

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺庫,提供了大量的計算機視覺算法和工具。以下是OpenCV的主要功能: 圖像處理
    的頭像 發表于 07-16 10:35 ?2573次閱讀

    OpenCV攜奧比中光3D相機亮相CVPR 2024

    6月17日-21日,奧比中光合作伙伴OpenCV攜Orbbec 3D相機參展在美國西雅圖舉辦的CVPR 2024(即IEEE國際計算機視覺與模式識別會議),讓開發者親身體驗Orbbec 3D相機
    的頭像 發表于 06-21 09:38 ?894次閱讀