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

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

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

簡述我們該如何使用OpenCV測量圖像中物體之間的距離

新機器視覺 ? 來源: OpenCV視覺實踐 ? 作者: OpenCV視覺實踐 ? 2021-03-12 11:39 ? 次閱讀

計算物體之間的距離與計算圖像中物體的大小算法思路非常相似——都是從參考對象開始的。我們將使用0.25美分作為我們的參考對象,它的寬度為0.955英寸。

并且我們還將0.25美分總是放在圖片最左側使其容易識別。這樣它就滿足了我們上面提到的參考對象的兩個特征。

我們的目標是找到0.25美分,然后利用0.25美分的尺寸來測量0.25美分硬幣與所有其他物體之間的距離。

定義參考對象并計算距離

打開一個新文件,將其命名為distance_between.py,插入以下代碼:

# import the necessary packagesfrom scipy.spatial import distance as distfrom imutils import perspectivefrom imutils import contoursimport numpy as npimport argparseimport imutilsimport cv2def midpoint(ptA, ptB):return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5)# construct the argument parse and parse the argumentsap = argparse.ArgumentParser()ap.add_argument("-i", "--image", required=True,help="path to the input image")ap.add_argument("-w", "--width", type=float, required=True,help="width of the left-most object in the image (in inches)")args = vars(ap.parse_args())

我們這里的代碼與上周的代碼幾乎相同。我們從在第2-8行上導入所需的Python包開始。第12-17行解析命令行參數(shù)。這里我們需要兩個參數(shù):——image,它是包含我們想要測量的對象的輸入圖像的路徑,以及——width,為我們參考對象的寬度(單位為英寸)。

接下來,我們需要對圖像進行預處理:

# load the image, convert it to grayscale, and blur it slightlyimage = cv2.imread(args["image"])gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray, (7, 7), 0)# perform edge detection, then perform a dilation + erosion to# close gaps in between object edgesedged = cv2.Canny(gray, 50, 100)edged = cv2.dilate(edged, None, iterations=1)edged = cv2.erode(edged, None, iterations=1)# find contours in the edge mapcnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)# sort the contours from left-to-right and, then initialize the# distance colors and reference object(cnts, _) = contours.sort_contours(cnts)colors = ((0, 0, 255), (240, 0, 159), (0, 165, 255), (255, 255, 0),(255, 0, 255))refObj = None

第2-4行從磁盤加載圖像,將其轉換為灰度圖,然后使用7 x 7內(nèi)核的高斯濾波器對其進行模糊降噪。

當我們的圖像被模糊后,我們應用Canny邊緣檢測器來檢測圖像中的邊緣,然后進行膨脹+腐蝕來縮小邊緣圖中的縫隙(第7-9行)。

調用cv2.findContours檢測邊緣圖中對象的輪廓(第11-13行),而第16行從左到右對輪廓進行排序。由于我們知道0.25美分(即參考對象)將始終是圖像中最左邊,因此從左到右對輪廓進行排序可以確保與參考對象對應的輪廓始終是cnts列表中的第一個。

然后,我們初始化用于繪制距離的colors列表以及refObj變量,該變量將存儲參考對象的邊界框、質心和pixels-per-metric值(看上一篇就明白pixels-per-metric的具體定義,其實就是參考對象的實際大?。▎挝挥⒋纾┡c圖片中的寬度(單位為像素)的比值)。

# loop over the contours individuallyfor c in cnts:# if the contour is not sufficiently large, ignore itif cv2.contourArea(c) < 100:continue# compute the rotated bounding box of the contourbox = cv2.minAreaRect(c)box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)box = np.array(box, dtype="int")# order the points in the contour such that they appear# in top-left, top-right, bottom-right, and bottom-left# order, then draw the outline of the rotated bounding# boxbox = perspective.order_points(box)# compute the center of the bounding boxcX = np.average(box[:, 0])cY = np.average(box[:, 1])

在第2行,我們開始對cnts列表中的每個輪廓進行循環(huán)。如果輪廓比較小(第4和5行),我們認為是噪聲并忽略它。

然后,第7-9行計算當前對象的最小旋轉包圍框。

第14行上調用order_points函數(shù)(此系列第一篇定義的函數(shù))來對矩形框四個頂點以左上角、右上角、右下角和左下角的順序排列,我們將看到,在計算物體之間的距離時,這一點非常重要。

第16行和第17行通過取邊界框在x和y方向上的平均值來計算旋轉后的邊界框的中心(x, y)坐標。

下一步是校準我們的refObj:

# if this is the first contour we are examining (i.e.,# the left-most contour), we presume this is the# reference objectif refObj is None:# unpack the ordered bounding box, then compute the# midpoint between the top-left and top-right points,# followed by the midpoint between the top-right and# bottom-right(tl, tr, br, bl) = box(tlblX, tlblY) = midpoint(tl, bl)(trbrX, trbrY) = midpoint(tr, br)# compute the Euclidean distance between the midpoints,# then construct the reference objectD = dist.euclidean((tlblX, tlblY), (trbrX, trbrY))refObj = (box, (cX, cY), D / args["width"])continue

如果refObj為None(第4行),則需要對其進行初始化。

我們首先獲取(排序后的)最小旋轉邊界框坐標,并分別計算四個頂點之間的中點(第10-15行)。

然后計算中點之間的歐氏距離,給出我們的“像素/尺寸”比例,來確定一英寸為多少像素寬度。

最后,我們將refObj實例化為一個3元組,包括:

  • 物體對象的最小旋轉矩形對象box

  • 參考對象的質心。

  • 像素/寬度比例,我們將用其來結合物體之間的像素距離來確定物體之間的實際距離。

下一個代碼塊負責繪制參考對象和當前檢查對象的輪廓,然后定義變量refCoords和objCoords,這樣(1)最小包圍矩陣坐標和(2)質心的(x, y)坐標都包含在同一個數(shù)組中:

# draw the contours on the imageorig = image.copy()cv2.drawContours(orig, [box.astype("int")], -1, (0, 255, 0), 2)cv2.drawContours(orig, [refObj[0].astype("int")], -1, (0, 255, 0), 2)# stack the reference coordinates and the object coordinates# to include the object centerrefCoords = np.vstack([refObj[0], refObj[1]])objCoords = np.vstack([box, (cX, cY)])

現(xiàn)在我們可以開始計算圖像中各個物體的質心和質心之間的距離了:
# loop over the original points

for ((xA, yA), (xB, yB), color) in zip(refCoords, objCoords, colors):# draw circles corresponding to the current points and# connect them with a linecv2.circle(orig, (int(xA), int(yA)), 5, color, -1)cv2.circle(orig, (int(xB), int(yB)), 5, color, -1)cv2.line(orig, (int(xA), int(yA)), (int(xB), int(yB)),color, 2)# compute the Euclidean distance between the coordinates,# and then convert the distance in pixels to distance in# unitsD = dist.euclidean((xA, yA), (xB, yB)) / refObj[2](mX, mY) = midpoint((xA, yA), (xB, yB))cv2.putText(orig, "{:.1f}in".format(D), (int(mX), int(mY - 10)),cv2.FONT_HERSHEY_SIMPLEX, 0.55, color, 2)# show the output imagecv2.imshow("Image", orig)cv2.waitKey(0)

在第2行,我們開始對圖片中物體對象的頂點(x, y)坐標進行循環(huán)。

然后我們畫一個圓表示我們正在計算距離的當前點坐標,并畫一條線連接這些點(第5-7條線)。

然后,第12行計算參考位置和對象位置之間的歐式距離,然后除以“像素/度量”,得到兩個對象之間的實際距離(以英寸為單位)。然后在圖像上標識出計算的距離(第13-15行)。

距離測量結果

下面是一個GIF動畫,演示了我們的程序運行效果:

在每種情況下,我們的腳本都匹配左上(紅色)、右上(紫色)、右下(橙色)、左下(藍綠色)和質心(粉色)坐標,然后計算參考對象和當前對象之間的距離(以英寸為單位)。

注意圖像中的兩個0.25美分完全平行,這意味著所有五個頂點之間的距離均為6.1英寸。

下面是第二個例子,這次計算的是參考對象和藥丸之間的距離:

這個例子可以作為藥片分類機器人的輸入,自動獲取一組藥片,并根據(jù)它們的大小和與藥片容器的距離來組織它們。

編輯:jq


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

    關注

    29

    文章

    622

    瀏覽量

    41091

原文標題:使用OpenCV測量圖像中物體之間的距離

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

收藏 人收藏

    評論

    相關推薦

    OpenCV圖像識別C++代碼

    的頭文件 在您的C++代碼,包含以下必要的頭文件: # include # include # include # include # include # include # include 讀取圖像
    的頭像 發(fā)表于 07-16 10:42 ?1103次閱讀

    opencv圖像識別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,提供了大量的圖像處理和計算機視覺相關的算法。以下是一些常見的OpenCV
    的頭像 發(fā)表于 07-16 10:40 ?374次閱讀

    opencv-python和opencv一樣嗎

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

    opencv的主要功能有哪些

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

    【Longan Pi 3H 開發(fā)板試用連載體驗】給ChatGPT裝上眼睛,并且還可以語音對話:7,圖像采集與物體識別

    圖像采集與物體識別 上一篇完成了所有音頻相關的輸入輸出,先在要開始嘗試視頻的相關操作了。我們可以利用手機上的攝像頭,將其變成一個網(wǎng)絡攝像頭,然后再在Longan Pi上獲取
    發(fā)表于 04-16 16:56

    簡儀科技推出一款使用高精度位移傳感器檢測物體微小位移的方案

    位移傳感器在現(xiàn)代工業(yè)扮演著不可或缺的角色,它可以精確測量物體的移動距離、高度、寬度以及物體之間
    的頭像 發(fā)表于 03-13 16:24 ?647次閱讀
    簡儀科技推出一款使用高精度位移傳感器檢測<b class='flag-5'>物體</b>微小位移的方案

    如何實現(xiàn)PIL和OpenCV之間圖像數(shù)據(jù)的轉換呢?

    PIL圖像數(shù)據(jù)格式轉換成OpenCV圖像數(shù)據(jù)格式
    的頭像 發(fā)表于 02-25 13:43 ?1001次閱讀

    AD CAM文件如何測量距離

    如何測量距離距離的定義和重要性 在AD CAM文件,距離是指廣告目標受眾與廣告內(nèi)容之間
    的頭像 發(fā)表于 01-08 10:16 ?1053次閱讀

    OpenCV零代碼實現(xiàn)線段距離測量

    OpenMV2024版本即將發(fā)行,支持多種主流深度學習模型從訓練到部署,支持更多傳統(tǒng)OpenCV算子流程設計與組合,支持一鍵導出流程,相比2023版本OpenMV,提供更多輔助開發(fā)工具。
    的頭像 發(fā)表于 01-08 09:15 ?423次閱讀
    <b class='flag-5'>OpenCV</b>零代碼實現(xiàn)線段<b class='flag-5'>距離</b><b class='flag-5'>測量</b>

    使用圖像處理庫OpenCV從攝像頭獲取數(shù)據(jù)并在PyQt5上顯示出來

    OpenCV能夠處理圖像、視頻、深度圖像等各種類型的視覺數(shù)據(jù)
    的頭像 發(fā)表于 01-05 17:32 ?1791次閱讀
    使用<b class='flag-5'>圖像</b>處理庫<b class='flag-5'>OpenCV</b>從攝像頭獲取數(shù)據(jù)并在PyQt5上顯示出來

    OpenCV4圖像分析之BLOB特征分析

    BLOB是圖像灰度塊的一種專業(yè)稱呼,更加變通一點的可以說它跟我們前面二值圖像分析的聯(lián)通組件類似,通過特征提取實現(xiàn)常見的各種灰度BLOB對象組件檢測與分離。使用
    的頭像 發(fā)表于 12-28 12:28 ?939次閱讀
    <b class='flag-5'>OpenCV</b>4<b class='flag-5'>圖像</b>分析之BLOB特征分析

    OpenCV邊緣模板匹配算法原理詳解

    OpenCV自帶的模板匹配算法,完全是像素基本的模板匹配,特別容易受到光照影響,光照稍微有所不同,方法就會歇菜了!搞得很多OpenCV初學者剛學習到
    的頭像 發(fā)表于 12-07 10:56 ?1104次閱讀
    <b class='flag-5'>OpenCV</b>邊緣模板匹配算法原理詳解

    ToF4M Unit高精度距離傳感器單元

    Time-of-Flight(ToF)是一種用于測量物體距離的技術。它通過測量光或其他波的往返時間來確定物體與傳感器
    的頭像 發(fā)表于 11-25 08:29 ?743次閱讀
    ToF4M Unit高精度<b class='flag-5'>距離</b>傳感器單元

    OpenCV初學者如何提取這些不規(guī)則的ROI區(qū)域

    ROI是英文Region Of Interest的三個首字母縮寫,很多時候我們圖像的分析就是對圖像特定ROI的分析與理解,對細胞與醫(yī)療圖像來說,ROI提取正確才可以進行后續(xù)的分析、
    的頭像 發(fā)表于 10-31 14:51 ?767次閱讀

    基于OpenCV的DNN圖像風格遷移

    /deep-photo-styletransfer 項目,需要安裝 CUDA、pytorch、cudnn等等,配置能花一天的時間。 不過最近我發(fā)現(xiàn)一個非常好的開源應用項目,那就是基于OpenCV的DNN圖像風格遷移。你只需要安裝Open
    的頭像 發(fā)表于 10-30 10:03 ?424次閱讀