一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

簡(jiǎn)述我們?cè)撊绾问褂肙penCV測(cè)量圖像中物體之間的距離

新機(jī)器視覺(jué) ? 來(lái)源: OpenCV視覺(jué)實(shí)踐 ? 作者: OpenCV視覺(jué)實(shí)踐 ? 2021-03-12 11:39 ? 次閱讀

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

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

我們的目標(biāo)是找到0.25美分,然后利用0.25美分的尺寸來(lái)測(cè)量0.25美分硬幣與所有其他物體之間的距離。

定義參考對(duì)象并計(jì)算距離

打開一個(gè)新文件,將其命名為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行上導(dǎo)入所需的Python包開始。第12-17行解析命令行參數(shù)。這里我們需要兩個(gè)參數(shù):——image,它是包含我們想要測(cè)量的對(duì)象的輸入圖像的路徑,以及——width,為我們參考對(duì)象的寬度(單位為英寸)。

接下來(lái),我們需要對(duì)圖像進(jìn)行預(yù)處理:

# 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行從磁盤加載圖像,將其轉(zhuǎn)換為灰度圖,然后使用7 x 7內(nèi)核的高斯濾波器對(duì)其進(jìn)行模糊降噪。

當(dāng)我們的圖像被模糊后,我們應(yīng)用Canny邊緣檢測(cè)器來(lái)檢測(cè)圖像中的邊緣,然后進(jìn)行膨脹+腐蝕來(lái)縮小邊緣圖中的縫隙(第7-9行)。

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

然后,我們初始化用于繪制距離的colors列表以及refObj變量,該變量將存儲(chǔ)參考對(duì)象的邊界框、質(zhì)心和pixels-per-metric值(看上一篇就明白pixels-per-metric的具體定義,其實(shí)就是參考對(duì)象的實(shí)際大?。▎挝挥⒋纾┡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行,我們開始對(duì)cnts列表中的每個(gè)輪廓進(jìn)行循環(huán)。如果輪廓比較小(第4和5行),我們認(rèn)為是噪聲并忽略它。

然后,第7-9行計(jì)算當(dāng)前對(duì)象的最小旋轉(zhuǎn)包圍框。

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

第16行和第17行通過(guò)取邊界框在x和y方向上的平均值來(lái)計(jì)算旋轉(zhuǎn)后的邊界框的中心(x, y)坐標(biāo)。

下一步是校準(zhǔn)我們的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行),則需要對(duì)其進(jìn)行初始化。

我們首先獲取(排序后的)最小旋轉(zhuǎn)邊界框坐標(biāo),并分別計(jì)算四個(gè)頂點(diǎn)之間的中點(diǎn)(第10-15行)。

然后計(jì)算中點(diǎn)之間的歐氏距離,給出我們的“像素/尺寸”比例,來(lái)確定一英寸為多少像素寬度。

最后,我們將refObj實(shí)例化為一個(gè)3元組,包括:

  • 物體對(duì)象的最小旋轉(zhuǎn)矩形對(duì)象box

  • 參考對(duì)象的質(zhì)心。

  • 像素/寬度比例,我們將用其來(lái)結(jié)合物體之間的像素距離來(lái)確定物體之間的實(shí)際距離。

下一個(gè)代碼塊負(fù)責(zé)繪制參考對(duì)象和當(dāng)前檢查對(duì)象的輪廓,然后定義變量refCoords和objCoords,這樣(1)最小包圍矩陣坐標(biāo)和(2)質(zhì)心的(x, y)坐標(biāo)都包含在同一個(gè)數(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)在我們可以開始計(jì)算圖像中各個(gè)物體的質(zhì)心和質(zhì)心之間的距離了:
# 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行,我們開始對(duì)圖片中物體對(duì)象的頂點(diǎn)(x, y)坐標(biāo)進(jìn)行循環(huán)。

然后我們畫一個(gè)圓表示我們正在計(jì)算距離的當(dāng)前點(diǎn)坐標(biāo),并畫一條線連接這些點(diǎn)(第5-7條線)。

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

距離測(cè)量結(jié)果

下面是一個(gè)GIF動(dòng)畫,演示了我們的程序運(yùn)行效果:

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

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

下面是第二個(gè)例子,這次計(jì)算的是參考對(duì)象和藥丸之間的距離:

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

編輯:jq


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

    關(guān)注

    31

    文章

    642

    瀏覽量

    42273

原文標(biāo)題:使用OpenCV測(cè)量圖像中物體之間的距離

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于LockAI視覺(jué)識(shí)別模塊:C++圖像的基本運(yùn)算

    圖像處理,理解圖像的基本操作是掌握計(jì)算機(jī)視覺(jué)技術(shù)的關(guān)鍵。本文章將介紹 基于LockAI視覺(jué)識(shí)別模塊下OpenCV
    發(fā)表于 05-06 16:56

    電機(jī)、變頻器之間距離多少為宜?·

    分析與實(shí)際應(yīng)用兩個(gè)角度,深入探討電機(jī)與變頻器之間距離多少為宜的問(wèn)題。 一、距離分類與影響 首先,我們需要明確電機(jī)與變頻器之間距離的界定。一般而言,根據(jù)
    的頭像 發(fā)表于 04-17 16:44 ?110次閱讀
    電機(jī)、變頻器<b class='flag-5'>之間</b>的<b class='flag-5'>距離</b>多少為宜?·

    AI模型部署邊緣設(shè)備的奇妙之旅:如何在邊緣端部署OpenCV

    視覺(jué)領(lǐng)域最有力的研究工具。在深度學(xué)習(xí),我們會(huì)經(jīng)常接觸到兩個(gè)名稱,圖像處理和計(jì)算機(jī)視覺(jué),它們之間有什么區(qū)別呢? 圖像處理 (Image Pr
    發(fā)表于 12-14 09:31

    AI模型部署邊緣設(shè)備的奇妙之旅:如何在邊緣端部署OpenCV

    力的研究工具。在深度學(xué)習(xí)我們會(huì)經(jīng)常接觸到兩個(gè)名稱,圖像處理和計(jì)算機(jī)視覺(jué),它們之間有什么區(qū)別呢?圖像處理(ImageProcessing)
    的頭像 發(fā)表于 12-14 09:10 ?703次閱讀
    AI模型部署邊緣設(shè)備的奇妙之旅:如何在邊緣端部署<b class='flag-5'>OpenCV</b>

    基于OpenCV的拆分和合并圖像通道實(shí)驗(yàn)案例分享_基于RK3568教學(xué)實(shí)驗(yàn)箱

    一、實(shí)驗(yàn)?zāi)康?本節(jié)視頻的目的是了解圖像通道的概念,學(xué)習(xí)OpenCV的基本操作,并掌握通過(guò)OpenCV實(shí)現(xiàn)拆分和合并圖像通道的方法。 二、實(shí)驗(yàn)原理 拆分與合并
    發(fā)表于 12-03 14:27

    一個(gè)月速成python+OpenCV圖像處理

    OpenCV是一個(gè)廣受歡迎且極為流行的計(jì)算機(jī)視覺(jué)庫(kù),它因其強(qiáng)大的功能、靈活性和開源特性而在開發(fā)者和研究者備受青睞。學(xué)習(xí)OpenCV主要就是學(xué)習(xí)里面的計(jì)算機(jī)視覺(jué)算法。要學(xué)習(xí)這些算法的原理,知道它們
    的頭像 發(fā)表于 11-29 18:27 ?347次閱讀
    一個(gè)月速成python+<b class='flag-5'>OpenCV</b><b class='flag-5'>圖像</b>處理

    OpenCV教程之OpenCV圖像閾值處理

    閾值的基本概念是為了簡(jiǎn)化圖像以進(jìn)行分析。當(dāng)我們圖像轉(zhuǎn)換為灰度圖像時(shí),必須記住灰度圖像仍然至少有255個(gè)值。閾值是將所有內(nèi)容轉(zhuǎn)換為白色或黑色
    的頭像 發(fā)表于 11-16 10:16 ?516次閱讀
    <b class='flag-5'>OpenCV</b>教程之<b class='flag-5'>OpenCV</b><b class='flag-5'>圖像</b>閾值處理

    手寫圖像模板匹配算法在OpenCV的實(shí)現(xiàn)

    OpenCV的模板匹配是支持基于NCC相似度查找的,但是不是很好用,一個(gè)主要的原因是查找最大閾值,只能匹配一個(gè),自己比對(duì)閾值,又導(dǎo)致無(wú)法正確設(shè)定閾值范圍,所以問(wèn)題很多。于是我重新寫了純Python版本的NCC圖像模板匹配的代碼
    的頭像 發(fā)表于 11-11 10:12 ?595次閱讀
    手寫<b class='flag-5'>圖像</b>模板匹配算法在<b class='flag-5'>OpenCV</b><b class='flag-5'>中</b>的實(shí)現(xiàn)

    OpenCV圖像識(shí)別C++代碼

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

    opencv圖像識(shí)別有什么算法

    OpenCV(Open Source Computer Vision Library)是一個(gè)開源的計(jì)算機(jī)視覺(jué)和機(jī)器學(xué)習(xí)軟件庫(kù),提供了大量的圖像處理和計(jì)算機(jī)視覺(jué)相關(guān)的算法。以下是一些常見的OpenCV
    的頭像 發(fā)表于 07-16 10:40 ?1589次閱讀

    opencv-python和opencv一樣嗎

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

    opencv的主要功能有哪些

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

    測(cè)量物體表面的靜電值的方法

    金屬板方便隨時(shí)隨地進(jìn)行離子平衡的測(cè)量。FMX-004?靜電場(chǎng)測(cè)量儀的測(cè)量標(biāo)準(zhǔn)為距離物件表面25mm(±0.5mm)處所檢測(cè)數(shù)據(jù)?(即2個(gè)紅色LED?燈照射在
    的頭像 發(fā)表于 07-03 15:53 ?1244次閱讀

    嵌入式學(xué)習(xí)-飛凌ElfBoard ELF 1板卡 - 如何在Ubuntu編譯OpenCV庫(kù)

    在之前發(fā)布的文章探討了交叉編譯OpenCV并部署至嵌入式系統(tǒng)的方法。然而,在調(diào)試階段,我們發(fā)現(xiàn)在 Ubuntu 環(huán)境下將 OpenCV 編譯為 X86 架構(gòu)可能更加方便和高效。 通過(guò)
    發(fā)表于 06-07 09:21

    ELF 1技術(shù)貼|如何在Ubuntu編譯OpenCV庫(kù)

    在之前發(fā)布的文章探討了交叉編譯OpenCV并部署至嵌入式系統(tǒng)的方法。然而,在調(diào)試階段,我們發(fā)現(xiàn)在Ubuntu環(huán)境下將OpenCV編譯為X86架構(gòu)可能更加方便和高效。通過(guò)在主機(jī)上編譯并
    的頭像 發(fā)表于 05-31 16:41 ?1339次閱讀
    ELF 1技術(shù)貼|如何在Ubuntu<b class='flag-5'>中</b>編譯<b class='flag-5'>OpenCV</b>庫(kù)