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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(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ì)象開(kāi)始的。我們將使用0.25美分作為我們的參考對(duì)象,它的寬度為0.955英寸。

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

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

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

打開(kāi)一個(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包開(kāi)始。第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行從磁盤(pán)加載圖像,將其轉(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行,我們開(kāi)始對(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)在我們可以開(kāi)始計(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行,我們開(kāi)始對(duì)圖片中物體對(duì)象的頂點(diǎn)(x, y)坐標(biāo)進(jìn)行循環(huán)。

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

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

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

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

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

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

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

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

編輯:jq


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)注

    32

    文章

    642

    瀏覽量

    42879

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    【Milk-V Duo S 開(kāi)發(fā)板免費(fèi)體驗(yàn)】SDK編譯、人臉檢測(cè)、OpenCV測(cè)試

    -mobile-test ./opencv-mobile-test 生成 200x200 尺寸的 out.jpg 圖像,即實(shí)現(xiàn)圖片壓縮。 測(cè)試工程可結(jié)合物體識(shí)別模型,實(shí)現(xiàn)輸入
    發(fā)表于 07-11 13:48

    超聲波測(cè)距換能器:工業(yè)與生活測(cè)量利器

    在科技飛速發(fā)展的今天,各類(lèi)傳感器在各個(gè)領(lǐng)域發(fā)揮著至關(guān)重要的作用。其中,超聲波測(cè)距換能器憑借其獨(dú)特的優(yōu)勢(shì),成為了距離測(cè)量領(lǐng)域的明星產(chǎn)品。無(wú)論是工業(yè)生產(chǎn)中的精密檢測(cè),還是日常生活的智能應(yīng)用,超聲波測(cè)距
    發(fā)表于 07-02 16:20

    為何激光三維掃描無(wú)需噴粉也能精準(zhǔn)測(cè)量高反光物體?—— 基于光學(xué)抗反射技術(shù)的突破

    噴粉也能實(shí)現(xiàn)高反光物體的精準(zhǔn)測(cè)量,為領(lǐng)域帶來(lái)新突破。 傳統(tǒng)高反光物體測(cè)量的困境與技術(shù)瓶頸 傳統(tǒng)激光三維掃描基于三角測(cè)距原理,高反光
    的頭像 發(fā)表于 06-27 09:58 ?119次閱讀
    為何激光三維掃描無(wú)需噴粉也能精準(zhǔn)<b class='flag-5'>測(cè)量</b>高反光<b class='flag-5'>物體</b>?—— 基于光學(xué)抗反射技術(shù)的突破

    itop-3568開(kāi)發(fā)板機(jī)器視覺(jué)opencv開(kāi)發(fā)手冊(cè)-圖像繪制-畫(huà)線

    demo11_line.py 然后向該文件添加以下內(nèi)容: 第 1 行和第 2 行分別導(dǎo)入了 opencv 和 numpy 庫(kù); 第 3 行使用 zeros()函數(shù)創(chuàng)建一個(gè) 512x512 的黑色圖片; 第 4 行使
    發(fā)表于 06-04 10:38

    基于LockAI視覺(jué)識(shí)別模塊:C++使用圖像的統(tǒng)計(jì)信息

    圖像處理,統(tǒng)計(jì)信息可以幫助我們了解圖像的特性,例如區(qū)域內(nèi)的像素分布、顏色轉(zhuǎn)換以及特定區(qū)域的分析。本文將介紹基于LockAI視覺(jué)識(shí)別模塊如何提取興趣區(qū)域(ROI)、轉(zhuǎn)換顏色通道、計(jì)算
    發(fā)表于 05-08 10:31

    基于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)題。 一、距離分類(lèi)與影響 首先,我們需要明確電機(jī)與變頻器之間距離的界定。一般而言,根據(jù)
    的頭像 發(fā)表于 04-17 16:44 ?422次閱讀
    電機(jī)、變頻器<b class='flag-5'>之間</b>的<b class='flag-5'>距離</b>多少為宜?·

    圖像尺寸測(cè)量優(yōu)勢(shì):數(shù)量識(shí)別

    普密斯圖像尺寸測(cè)量儀運(yùn)用了先進(jìn)的光學(xué)成像與圖像處理技術(shù),這一技術(shù)是其實(shí)現(xiàn)高效精準(zhǔn)測(cè)量的核心。當(dāng)面對(duì)多個(gè)電子產(chǎn)品同時(shí)測(cè)量時(shí),
    的頭像 發(fā)表于 01-17 15:13 ?468次閱讀
    <b class='flag-5'>圖像</b>尺寸<b class='flag-5'>測(cè)量</b>優(yōu)勢(shì):數(shù)量識(shí)別

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

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

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

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

    如何遠(yuǎn)距離的傳輸camera圖像呢?

    如何遠(yuǎn)距離的傳輸camera圖像呢?camera可以是lvds,mipi等接口。
    發(fā)表于 12-12 07:32

    基于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)大的功能、靈活性和開(kāi)源特性而在開(kāi)發(fā)者和研究者備受青睞。學(xué)習(xí)OpenCV主要就是學(xué)習(xí)里面的計(jì)算機(jī)視覺(jué)算法。要學(xué)習(xí)這些算法的原理,知道它們
    的頭像 發(fā)表于 11-29 18:27 ?458次閱讀
    一個(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 ?643次閱讀
    <b class='flag-5'>OpenCV</b>教程之<b class='flag-5'>OpenCV</b><b class='flag-5'>圖像</b>閾值處理

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

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