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

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

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

3天內不再提示

如何使用OpenCV測量圖像中物體間距離

新機器視覺 ? 來源:光頭哥哥的博客 ? 2023-03-23 11:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

386aa49c-c8aa-11ed-bfe3-dac502259ad0.jpg

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

定義參考對象并計算距離

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

# import the necessary packages
from scipy.spatial import distance as dist
from imutils import perspective
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2
def midpoint(ptA, ptB):
return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5)
# construct the argument parse and parse the arguments
ap = 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行解析命令行參數。這里我們需要兩個參數:——image,它是包含我們想要測量的對象的輸入圖像的路徑,以及——width,為我們參考對象的寬度(單位為英寸)。

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

# load the image, convert it to grayscale, and blur it slightly
image = 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 edges
edged = cv2.Canny(gray, 50, 100)
edged = cv2.dilate(edged, None, iterations=1)
edged = cv2.erode(edged, None, iterations=1)
# find contours in the edge map
cnts = 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內核的高斯濾波器對其進行模糊降噪。

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

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

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

# loop over the contours individually
for c in cnts:
  # if the contour is not sufficiently large, ignore it
if cv2.contourArea(c) < 100:
continue
  # compute the rotated bounding box of the contour
box = 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
  # box
box = perspective.order_points(box)
  # compute the center of the bounding box
cX = np.average(box[:, 0])
cY = np.average(box[:, 1])

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

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

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

第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 object
if 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 object
    D = 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)坐標都包含在同一個數組中:

# draw the contours on the image
orig = 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 center
  refCoords = np.vstack([refObj[0], refObj[1]])
  objCoords = np.vstack([box, (cX, cY)])

現在我們可以開始計算圖像中各個物體的質心和質心之間的距離了:

# 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 line
    cv2.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
# units
    D = 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 image
    cv2.imshow("Image", orig)
    cv2.waitKey(0)

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

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

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

距離測量結果

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

37fca960-c8aa-11ed-bfe3-dac502259ad0.gif

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

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

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

38fe3194-c8aa-11ed-bfe3-dac502259ad0.gif

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

最后一個例子計算了我們的參考對象(一張3.5英寸x 2英寸的名片)和一組7英寸的黑膠唱片和信封之間的距離:

3964b2ca-c8aa-11ed-bfe3-dac502259ad0.gif

編輯:黃飛

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

    關注

    32

    文章

    642

    瀏覽量

    42880

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    使用Python和OpenCV查找從相機到物體/標記的距離

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

    使用Labview vision來搜索圖像物體

    ` 本帖最后由 1453544229 于 2015-8-19 15:39 編輯 效果如下圖:上圖為整個圖像,可選擇圖像的部分區域,并搜索圖像
    發表于 08-19 15:39

    【芯靈思A83T試用申請】嵌入式視覺--遠距離物體跟蹤與定位

    OpenCV環境,連接工業相機3)物體跟蹤與定位算法的實現4)結項與項目演示具體描述:本方案擬以嵌入式開發為基礎,基于CMOS相機和數字圖像處理技術的遠距離目標定位技術,研究
    發表于 04-27 14:18

    CCD圖像測量系統的組成

    信號,然后進一步通過AGC自動增益控制來補償照明條件的起伏。用做測量圖像信號經二值化處理后進入像素檢測器,在這里通過像素計數確定二值化圖形脈沖的間距值,并在乘以脈沖當量數值后得到實測的物體
    發表于 11-15 15:06

    AD軟件中點對點的測量距離 邊緣與邊緣間距測量方法介紹

    AD軟件中點對點的測量距離 邊緣與邊緣間距測量方法介紹Altium提供了兩種方式進行測量,一種是點對點的
    發表于 03-22 21:47

    如何使用OpenCV訪問Mat圖像每個像素的值

    本文檔的主要內容詳細介紹的是如何使用OpenCV訪問Mat圖像每個像素的值
    發表于 11-26 16:13 ?4次下載

    OpenCV圖像的計算

    今天我們一起學習的是OpenCV圖像的計算,在圖像計算,分為像素級運算和代數運算這兩大類,今天我們借助
    的頭像 發表于 11-03 17:45 ?2387次閱讀

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

    計算物體之間的距離與計算圖像物體的大小算法思路非常相似——都是從參考對象開始的。我們將使用0.25美分作為我們的參考對象,它的寬度為0.9
    的頭像 發表于 03-12 11:39 ?4121次閱讀

    關于一種新的遠距離測量高溫物體的方案

    需要新的高溫物體遠距測量方式 在鋼鐵、冶金、礦山等工業行業,高溫物體的檢測是一項重要的檢測項目,如高溫物體的尺寸、輪廓、位移等。因為受高溫
    發表于 06-23 15:31 ?825次閱讀

    用于距離測量物體檢測的飛行時間系統

    。時間延遲與相機與物體間距離的兩倍(往返)成正比。因此,距離可以估計為深度 d = (c × Δt)/2,其中 c 是光速。因此,ToF相機輸出2D數據以及所需的深度信息。
    的頭像 發表于 11-22 14:17 ?969次閱讀
    用于<b class='flag-5'>距離</b><b class='flag-5'>測量</b>和<b class='flag-5'>物體</b>檢測的飛行時間系統

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

    假設物體的寬度為 W,將其放到離相機距離為 D 的位置,然后對物體進行拍照。在照片上量出物體的像素寬度 P,于是可以得出計算相機焦距 F 的公式:
    的頭像 發表于 11-29 14:47 ?2767次閱讀

    用于距離測量物體檢測的飛行時間系統

    。時間延遲與相機與物體間距離的兩倍(往返)成正比。因此,距離可以估計為深度 d = (c × Δt)/2,其中 c 是光速。因此,ToF相機輸出2D數據以及所需的深度信息。
    的頭像 發表于 12-09 15:41 ?1185次閱讀
    用于<b class='flag-5'>距離</b><b class='flag-5'>測量</b>和<b class='flag-5'>物體</b>檢測的飛行時間系統

    使用超聲波測距儀測量物體距離

    電子發燒友網站提供《使用超聲波測距儀測量物體距離.zip》資料免費下載
    發表于 12-29 14:42 ?1次下載
    使用超聲波測距儀<b class='flag-5'>測量</b>到<b class='flag-5'>物體</b>的<b class='flag-5'>距離</b>

    OpenCV庫在圖像處理和深度學習的應用

    本文深入淺出地探討了OpenCV庫在圖像處理和深度學習的應用。從基本概念和操作,到復雜的圖像變換和深度學習模型的使用,文章以詳盡的代碼和解釋,帶領大家步入
    的頭像 發表于 08-18 11:33 ?1224次閱讀

    晶面間距測量(上期)

    高分辨照片可以獲得材料的晶格條紋像,如下圖。圖中的每行亮點都代表某個方向的晶面,兩列點之間的間距就代表晶面間距測量晶面間距是了解材料晶體結構的常見手段。 一般而言,
    的頭像 發表于 11-26 09:43 ?1862次閱讀
    晶面<b class='flag-5'>間距</b><b class='flag-5'>測量</b>(上期)