如何使用 OpenCV python 获取对象的大小?
Posted
技术标签:
【中文标题】如何使用 OpenCV python 获取对象的大小?【英文标题】:How to get the size of an object using OpenCV python? 【发布时间】:2020-05-26 23:53:57 【问题描述】:我有一个关于 opencv python 的问题,我在这里有一个图像示例我想知道如何使用 opencv python 获取这个对象的大小。
这是示例图片
这是我想要的输出
我只是在我想要的输出上使用绘画。
【问题讨论】:
How to Detect Contours in Images using OpenCV in Python 不是轮廓,我需要得到这个物体的尺寸嘿嘿。 要测量物体,首先要找到它的轮廓。或者使用机器学习或深度网络来识别图像上的对象。 您需要先获取轮廓,然后在它们周围放置一个框,然后测量该框的尺寸。这会给你以像素为单位的大小。如果您希望在现实世界中进行测量(如厘米或英寸),这是一个更加困难的问题,因为您必须拥有图像的校准数据才能将像素转换为现实世界。 那么在检测到轮廓之后呢?如何获得尺寸? 【参考方案1】:一种简单的方法是获取二值图像,然后在该图像上找到边界框。这是绘制到图像上的框的宽度(以像素为单位)和高度的结果。要确定真实世界的测量值,您需要校准信息以将像素缩放为具体值(例如厘米)。如果没有将像素转换为可量化长度的校准信息,则很难将其转换为真实尺寸。
代码
import cv2
# Load image, grayscale, Gaussian blur, Otsu's threshold
image = cv2.imread("1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Find bounding box
x,y,w,h = cv2.boundingRect(thresh)
cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)
cv2.putText(image, "w=,h=".format(w,h), (x,y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (36,255,12), 2)
cv2.imshow("thresh", thresh)
cv2.imshow("image", image)
cv2.waitKey()
【讨论】:
所以我需要一个数据?获得真实世界的大小 是的,您必须有一些校准数据。真实到像素的转化率 怎么做,我这里有数据。你能帮我吗? 我在图像上有一个额外的边界框,比我的图像小一点,我想忽略这个矩形框。有什么帮助吗?【参考方案2】:这里有一个快速建议,为什么不使用像 YOLO 这样的物体检测器,有很多预训练的权重可以在线下载,幸运的是,香蕉属于 coco 类。
你可以看看这个 github repo:https://github.com/divikshrivastava/drfoodie
编辑: 在这里查看示例 https://drive.google.com/file/d/1uJE0hy9mv75Ya3dqBIyw-kn1h87WLxy4/view?usp=drivesdk
【讨论】:
如果是真实世界的尺寸呢? 打扰一下,请问您能澄清一下尺寸,您是指面积还是直径? 我需要直径。【参考方案3】:在你的情况下,只使用 RGB 图片,你实际上不能。
不过,以下是一种简单实用的方法。您可能需要一个在现实世界中以可测量单位(例如毫米)为单位的已知尺寸的参考对象。这应该预先放置在与感兴趣对象的相机相同的距离处。检测到图像中的两个对象(参考对象和感兴趣对象)后,您将能够计算“每公制像素比率”以计算其实际大小。有关详细信息,请查看以下链接:tutorial、similarly in github。
另一种方法是使用深度相机,或者只是使用this answer 可能建议的替代技术来检索与感兴趣对象的距离。
(编辑)另一方面,由于您的问题并未完全阐明您是指真实世界的指标(即厘米)还是仅以像素为单位的度量,请原谅我误导您..
【讨论】:
以上是关于如何使用 OpenCV python 获取对象的大小?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 OpenCV 和 Python 通过索引从视频中获取帧?
如何使用 python opencv 裁剪图像中最大的对象?
如何从 OpenCV Python 中的特征匹配中获取像素坐标