那曲檬骨新材料有限公司

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

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

3天內不再提示

使用OpenCV實現目標物體到相機的距離測量

jt_rfid5 ? 來源:今日光電 ? 作者:今日光電 ? 2022-11-29 14:47 ? 次閱讀

攝像頭測距就是計算照片中的目標物體到相機的距離。可以使用相似三角形(triangle similarity)方法實現,或者使用更復雜但更準確的相機模型的內參來實現這個功能。

使用相似三角形計算物體到相機的距離

假設物體的寬度為 W,將其放到離相機距離為 D 的位置,然后對物體進行拍照。在照片上量出物體的像素寬度 P,于是可以得出計算相機焦距 F 的公式:
b8e83df2-6f0c-11ed-8abf-dac502259ad0.svg

比如我在相機前 24 英寸距離(D=24 inches)的位置橫著放了一張 8.5 x 11 英寸(W=11 inches)的紙,拍照后通過圖像處理得出照片上紙的像素寬度 P=248 pixels。所以焦距 F 等于:

b8fb5fc2-6f0c-11ed-8abf-dac502259ad0.svg

此時移動相機離物體更近或者更遠,我們可以應用相似三角形得到計算物體到相機的距離的公式:
b90c7cbc-6f0c-11ed-8abf-dac502259ad0.svg

原理大概就是這樣,接下來使用 OpenCV 來實現。

獲取目標輪廓

# import the necessary packages
from imutils import paths
import numpy as np
import imutils
import cv2
def find_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)
    cnts = imutils.grab_contours(cnts)
    c = max(cnts, key = cv2.contourArea)
    # compute the bounding box of the of the paper region and return it
    return cv2.minAreaRect(c)

定義一個 find_marker 函數,接收一個參數 iamge,用來找到要計算距離的物體。這里我們用一張 8.5 x 11 英寸的紙作為目標物體。第一個任務是在圖片中找到目標物體。

下面這三行是先將圖片轉換為灰度圖,并進行輕微模糊處理以去除高頻噪聲,然后進行邊緣檢測

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(gray, 35, 125)

做了這幾步后圖片看起來是這樣的:

現在已經可以清晰地看到這張紙的邊緣,接下來需要做的是找出這張紙的輪廓。

cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
c = max(cnts, key = cv2.contourArea)

用 cv2.findContours 函數找到圖片中的眾多輪廓,然后獲取其中面積最大的輪廓,并假設這是目標物體的輪廓。

這種假設只適用于我們這個場景,在實際使用時,在圖片中找出目標物體的方法與應用場景有很大關系。

我們這個場景用簡單的邊緣檢測并找出最大的輪廓就可以了。當然為了使程序更具有魯棒性,也可以用輪廓近似,并剔除不是四個點的輪廓(紙張是一個有四個點的矩形),然后再找出面積最大,具有四個點的輪廓。

注意: 關于這個方法,詳情可以查看這篇文章,用于構建一個移動文本掃描工具。

我們也可以根據顏色特征在圖片中找到目標物體,因為目標物體和背景的顏色有著很明顯的不同。還可以應用關鍵點檢測(keypoint detection),局部不變性描述子(local invariant descriptors)和關鍵點匹配(keypoint matching)來尋找目標。但是這些方法不在本文的討論范圍內,而且高度依賴具體場景。

我們現在得到目標物體的輪廓了,find_marker 函數最后返回的是包含輪廓 (x, y) 坐標、像素長度和像素寬度的邊框,

計算距離

接下來該使用相似三角形計算目標到相機的距離。

def distance_to_camera(knownWidth, focalLength, perWidth):
    # compute and return the distance from the maker to the camera
    return (knownWidth * focalLength) / perWidth

distance_to_camera 函數傳入目標的實際寬度,計算得到的焦距和圖片上目標的像素寬度,就可以通過相似三角形公式計算目標到相機的距離了。

下面是調用 distance_to_camera 函數之前的準備:

# 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 12 inches wide
KNOWN_WIDTH = 11.0


# 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("images/2ft.jpg")
marker = find_marker(image)
focalLength = (marker[1][0] * KNOWN_DISTANCE) / KNOWN_WIDTH

首先是測量目標物體的寬度,和目標物體到相機的距離,并根據上面介紹的方法計算相機的焦距。其實這些并不是真正的攝像機標定。真正的攝像機標定包括攝像機的內參,相關知識可以可以查看這里。

使用 cv2.imread 函數從磁盤加載圖片,然后通過 find_marker 函數得到圖片中目標物體的坐標和長寬信息,最后根據相似三角形計算出相機的焦距。

現在有了相機的焦距,就可以計算目標物體到相機的距離了。

# loop over the images
for imagePath in sorted(paths.list_images("images")):
    # load the image, find the marker in the image, then compute the
    # distance to the marker from the camera
    image = cv2.imread(imagePath)
    marker = find_marker(image)
    inches = distance_to_camera(KNOWN_WIDTH, focalLength, marker[1][0])


    # draw a bounding box around the image and display it
    box = cv2.cv.BoxPoints(marker) if imutils.is_cv2() else cv2.boxPoints(marker)
    box = np.int0(box)
    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)

使用 for 循環遍歷每個圖片,計算每張圖片中目標對象到相機的距離。在結果中,我們根據得到的輪廓信息將方框畫了出來,并顯示出了距離。

總結

通過這篇文章,我們學會了使用相似三角形計算圖片中一個已知物體到相機的距離。

需要先測量出目標物體的實際寬度和目標物體到相機的距離,然后使用圖像處理的方法自動計算圖片中目標物體的像素寬度,并使用相似三角形計算出相機的焦距。

根據相機的焦距就可以計算圖片中的目標物體到相機的距離。

審核編輯:郭婷

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

    關注

    60

    文章

    4865

    瀏覽量

    96317
  • 相機
    +關注

    關注

    4

    文章

    1369

    瀏覽量

    53915

原文標題:【光電智造】使用OpenCV實現攝像頭測距

文章出處:【微信號:今日光電,微信公眾號:今日光電】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

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

    適用于哪些場景,然后通過Python編寫代碼來實現這些算法,并應用于實際項目中,實現圖像的檢測、識別、分類、定位、測量目標。華清遠見【python+
    的頭像 發表于 12-09 16:42 ?485次閱讀
    【AI實戰項目】基于<b class='flag-5'>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 ?1159次閱讀
    基于<b class='flag-5'>OPENCV</b>的<b class='flag-5'>相機</b>捕捉視頻進行人臉檢測--米爾NXP i.MX93開發板

    目標檢測中大物體的重要性

    導讀實驗表明,對大型物體賦予更大的權重可以提高所有尺寸物體的檢測分數,從而整體提升目標檢測器的性能(在COCOval2017數據集上使用InternImage-T模型,小物體檢測精度提
    的頭像 發表于 10-09 08:05 ?509次閱讀
    在<b class='flag-5'>目標</b>檢測中大<b class='flag-5'>物體</b>的重要性

    紅外光電遠距離傳感器TYPE:E3K-M5DDK-S原理采用什么方式

    紅外光電遠距離傳感器通過發射紅外光束并接收其反射信號來測量目標物體距離,其原理基于紅外線的物體
    的頭像 發表于 09-25 14:36 ?265次閱讀

    什么是高光譜相機?高光譜相機有什么用?

    進行成像,從而獲得目標物體豐富的光譜特征。 高光譜相機通常由光學系統、探測器、信號處理單元等部分組成。光學系統負責收集目標物體反射或發射的光
    的頭像 發表于 09-06 15:39 ?629次閱讀
    什么是高光譜<b class='flag-5'>相機</b>?高光譜<b class='flag-5'>相機</b>有什么用?

    opencv-python和opencv一樣嗎

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

    opencv的主要功能有哪些

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

    測量物體表面的靜電值的方法

    金屬板方便隨時隨地進行離子平衡的測量。FMX-004?靜電場測量儀的測量標準為距離物件表面25mm(±0.5mm)處所檢測數據?(即2個紅色LED?燈照射在
    的頭像 發表于 07-03 15:53 ?953次閱讀

    基于 FPGA 的目標跟蹤電磁炮系統

    共同組成。預計實現功能:用電磁炮擊中移動中的物體。 目前,功能已實現,各模塊連接穩定,運行穩定。 電磁炮能準確擊中六米外的大小為 30cm*30cm,速度為 3.2m/s 的泡沫塊, 最遠擊打
    發表于 06-24 19:19

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

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

    開發者手機 AI - 目標識別 demo

    應用的demo。 應用程序通過相機進行預覽,對預覽畫面中的物體進行目標識別,目前該應用程序支持識別100種物體。 系統架構 下圖為demo應用以及Openharmony AI子系統的架
    發表于 04-11 16:14

    如何使用Rd-03E雷達實現實時監測目標距離呢?

    Rd-03E基于STM32F103C8T6平臺以UART為抓手實現監測目標距離可視化,通過GPIO賦能LED、Buzzer進一步強化視覺、聽覺感知。
    的頭像 發表于 03-25 14:44 ?723次閱讀
    如何使用Rd-03E雷達<b class='flag-5'>實現</b>實時監測<b class='flag-5'>目標</b><b class='flag-5'>距離</b>呢?

    工業鏡頭中常見的參數之工作距離、物距、法蘭距及鏡頭接口

    工業鏡頭中常用的一些關于距離的參數,別再傻傻分不清了。工作距離(WD)是指鏡頭最下端機械面物體距離。物像
    的頭像 發表于 03-11 15:29 ?5946次閱讀
    工業鏡頭中常見的參數之工作<b class='flag-5'>距離</b>、物距、法蘭距及鏡頭接口

    使用V851se視覺開發板制作超低成本的小相機

    這個超低成本的小相機是在V851se上移植使用全志在線開源版本的Tina Linux與OpenCV框架開啟攝像頭拍照捕獲視頻,并結合NPU實現Mobilenet v2目標分類識別以及運
    的頭像 發表于 02-25 10:05 ?1593次閱讀
    使用V851se視覺開發板制作超低成本的小<b class='flag-5'>相機</b>
    百家乐首页红利| 金世豪百家乐的玩法技巧和规则| 百家乐官网游戏玩法技巧| 电玩百家乐的玩法技巧和规则| 皇冠百家乐官网代理网址| 大连娱网棋牌步步为赢| 百家乐积分| 世嘉百家乐官网的玩法技巧和规则| 德州扑克| 威尼斯人娱乐平台注册| 百家乐博彩资讯论坛| 免费百家乐官网的玩法技巧和规则 | 鸟巢百家乐的玩法技巧和规则| 24天星吉凶| 百家乐官网的看路技巧| 网上百家乐官网如何作假| 垫江县| 澳门娱乐城| 大发888真人网站| 戒掉百家乐的玩法技巧和规则| 风水8闰24山| 玩百家乐官网的玩法技巧和规则 | 永胜博| 大发888老虎机| 二八杠算法| 实战百家乐十大取胜原因百分百战胜百家乐不买币不吹牛只你能做到按我说的.百家乐基本规则 | 百家乐官网下载| 韩国百家乐官网的玩法技巧和规则 | 百家乐园云鼎娱乐平台| 百家乐微笑投注| 百家乐庄闲出现几率| 做生意讲究风水吗| 免费百家乐官网统计| 金彩百家乐官网的玩法技巧和规则 | 大发888客服电话 导航| 大发888娱乐官方网站| 威尼斯人娱乐城免费注册| G3百家乐的玩法技巧和规则 | 百家乐官网赌场大全| 百家乐官网任你博赌场娱乐网规则 | 阿巴嘎旗|