在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

簡述我們該如何使用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行解析命令行參數。這里我們需要兩個參數:——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內核的高斯濾波器對其進行模糊降噪。

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

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

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

# 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列表中的每個輪廓進行循環。如果輪廓比較小(第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 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)坐標都包含在同一個數組中:

# 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)])

現在我們可以開始計算圖像中各個物體的質心和質心之間的距離了:
# 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)坐標進行循環。

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

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

距離測量結果

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

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

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

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

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

編輯:jq


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

    關注

    32

    文章

    642

    瀏覽量

    42538

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    itop-3568開發板機器視覺opencv開發手冊-圖像繪制-畫線

    demo11_line.py 然后向該文件添加以下內容: 第 1 行和第 2 行分別導入了 opencv 和 numpy 庫; 第 3 行使用 zeros()函數創建一個 512x512 的黑色圖片; 第 4 行使
    發表于 06-04 10:38

    基于LockAI視覺識別模塊:C++圖像的基本運算

    圖像處理,理解圖像的基本操作是掌握計算機視覺技術的關鍵。本文章將介紹 基于LockAI視覺識別模塊下OpenCV
    發表于 05-06 16:56

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

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

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

    視覺領域最有力的研究工具。在深度學習我們會經常接觸到兩個名稱,圖像處理和計算機視覺,它們之間有什么區別呢? 圖像處理 (Image Pr
    發表于 12-14 09:31

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

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

    如何遠距離的傳輸camera圖像呢?

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

    基于OpenCV的拆分和合并圖像通道實驗案例分享_基于RK3568教學實驗箱

    一、實驗目的 本節視頻的目的是了解圖像通道的概念,學習OpenCV的基本操作,并掌握通過OpenCV實現拆分和合并圖像通道的方法。 二、實驗原理 拆分與合并
    發表于 12-03 14:27

    一個月速成python+OpenCV圖像處理

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

    OpenCV教程之OpenCV圖像閾值處理

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

    手寫圖像模板匹配算法在OpenCV的實現

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

    OpenCV圖像識別C++代碼

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

    opencv圖像識別有什么算法

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

    opencv-python和opencv一樣嗎

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

    opencv的主要功能有哪些

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

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

    金屬板方便隨時隨地進行離子平衡的測量。FMX-004?靜電場測量儀的測量標準為距離物件表面25mm(±0.5mm)處所檢測數據?(即2個紅色LED?燈照射在
    的頭像 發表于 07-03 15:53 ?1358次閱讀
    主站蜘蛛池模板: 色骚综合| 三级网站在线 | 浮荡视频在线观看免费 | 成年人的毛片 | jlzzjlzzjlzz日本亚洲 | 痴女中文字幕在线视频 | 天天干天天干天天干天天干天天干 | 欧美日本一区二区三区道 | 全部免费特黄特色大片农村 | 全黄毛片 | 亚洲射图 | 黄色午夜网站 | 国产精品夜色一区二区三区 | 久久女同| 天天性视频 | 日本动漫在线看 | 青楼社区51在线视频视频 | 日本免费人成在线网站 | 天天躁日日躁狠狠躁中文字幕老牛 | 好硬好湿好爽再深一点h视频 | 久综合网 | 美女视频黄a全部免费看小说 | 五月婷久久| 午夜剧场刺激性爽免费视频 | 久久香蕉国产线看观看亚洲片 | 高清色黄毛片一级毛片 | 国产激情片 | 天堂网欧美 | 天天爱天天色 | 日韩在线三级视频 | 69xxx网站| 扛着高跟鞋丝袜腿呻吟视频 | 免费看日本大片免费 | 深爱五月激情 | 网友偷自拍原创区 | 亚欧毛片基地国产毛片基地 | 人人插人人 | 天天欲色| 天天干天天草天天射 | 亚洲国产精品丝袜在线观看 | 国产网站在线免费观看 |