![c123234a1dd840a3de4a38825f2fd627.png](https://i-blog.csdnimg.cn/blog_migrate/973adefaecfb9183d03529a4e5db1530.png)
原文链接
距离测量 使用 OpenCV 测量 图像中 对象 之间的 距离hotdog29.com在 2019年7月31日 上张贴 由 hotdog发表回复
距离测量 使用 OpenCV 测量 图像中 对象 之间的 距离
我们现在已经完成了关于测量图像中对象大小和 计算对象之间距离的三部分系列的最后一部分 。 距离测量
两周前,我们通过学习如何(正确)使用Python和OpenCV以顺时针方式排序坐标来开始本轮教程。然后,在上周,我们讨论了如何 使用参考对象测量图像f="https://www.pyimagesearch.com/2016/03/28/measuring-size-of-objects-in-an-image-with-opencv/">中对象的 大小。
此引用对象应具有两个重要属性,包括:
- 我们知道物体的尺寸(以英寸,毫米等为单位)。
- 它可以 在我们的图像中轻松识别(基于 位置或 外观)。
给定这样的参考对象,我们可以使用它来计算图像中对象的大小。
今天,我们将结合本系列之前博客文章中使用的技术,并使用这些方法计算对象之间的 距离。距离测量继续阅读以了解如何......
寻找这篇文章的源代码?
跳到下载部分。
使用OpenCV测量图像中对象之间的距离
计算对象之间的距离 非常类似于计算图像中对象的 大小 - 它都以参考对象开始。
正如我们之前的博文中所详述的,我们的引用对象应该有两个重要的属性:
- 属性#1:我们知道某个可测量单位中物体的尺寸(例如英寸,毫米等)。
- 属性#2: 我们可以在图像中轻松找到并识别参考对象。
就像我们上周所做的那样,我们将使用硬币作为我们的参考对象,其宽度为0.955英寸(满足属性#1)。
我们还将确保我们的四分之一始终是我们图像中最左边的对象,从而满足属性#2:
![e24a363cbdc8a34afb3ac37e578c8efe.png](https://i-blog.csdnimg.cn/blog_migrate/5d09e198a82b4b33b70cc6ff6a46fd8d.jpeg)
图1:我们将根据位置识别我们的参考对象,因此我们将始终确保我们的硬币是图像中最左边的对象。
我们在此图像中的目标是(1)找到该区域,然后(2)使用该区域的尺寸来测量该区域与所有其他对象之间的距离 。
定义我们的参考对象和计算距离
让我们继续吧,让这个例子开始吧。打开一个新文件,将其命名为 distance_between 。py ,并插入以下代码
![5fd3a44f80ba88626f2de79babd84fc2.png](https://i-blog.csdnimg.cn/blog_migrate/ecc2728b147d058d93b8478035f8ce68.jpeg)
我们的代码与上周几乎完全相同。我们首先在第2-8行导入我们所需的Python包 。如果您还没有安装imutils软件包,请立即停止安装$ pip install imutils
否则,您应升级到最新版本( 撰写本文时为0.3.6),以便获得更新的order_points函数$ pip install --upgrade imutils
第14-19行 解析了我们的命令行参数。我们需要两个参数: - image ,它是包含我们想要测量的对象的输入图像的路径,以及 - width ,我们的参考对象的宽度(以英寸为单位)。
接下来,我们需要预处理我们的图像
第22-24行从磁盘加载我们的图像,将其转换为灰度,然后使用带有7 x 7内核的高斯滤波器将其模糊 。
一旦我们的图像模糊,我们应用Canny边缘检测器来检测图像中的边缘 - 然后执行扩张+侵蚀以关闭边缘图中的任何间隙(第28-30行)。
调用 cv2.findContours 检测边缘图中对象的轮廓(第33-35行),而 第39行从左到右对轮廓进行排序。由于我们知道我们的硬币(即 参考对象)将始终是图像中最左侧的对象,因此从左到右对轮廓进行排序可确保对应于参考对象的轮廓始终是第 一个条目在 cnts 列表中。
然后,我们初始化 用于绘制距离的颜色列表 以及 refObj 变量,该变量将存储我们的边界框,质心和参考对象的每度量像素值。
![2c43a2cd4fd98ae58226b1665e69b81d.png](https://i-blog.csdnimg.cn/blog_migrate/5ec45da27904de8e048670fc6ae9a985.jpeg)
在 第45行,我们开始循环遍历cnts 列表中的每个轮廓 。如果轮廓不够大(第47和48行),我们会忽略它。
否则, 行51-53计算当前对象的旋转边界框(在 OpenCV 2.4 使用 cv2.cv.BoxPoints 在OpenCV 3 使用 cv2.boxPoints )。
在 第59行调用 order_points重新排列边界框 (x,y) - 在左上角,右上角,右下角和左下角的顺序,当我们去计算物体角落之间的距离 我们将看到, 。62和63通过取x和 y方向上的边界框的平均值来计算旋转的边界框的中心 (x,y)坐标 。
下一步是校准我们的 refObj
如果我们的 refObj 是 None (第68行),那么我们需要初始化它。
我们首先解开(有序)旋转的边界框坐标并分别计算左上角和左下角之间的中点以及右上角和右下角(第73-75行)。
从那里,我们计算点之间的欧几里德距离,给出我们的“每度量像素”,允许我们确定适合的像素数 - width 英寸。注意:有关“pixel-per-metric”变量的更详细讨论,请参阅上周的帖子。
最后,我们将refObj实例 化为 一个包含以下内容的3元组:
- 与旋转的边界框参考对象相对应的排序坐标。
- 参考对象的质心。
- 我们将用于确定对象之间距离的每像素像素比率。
我们的下一个代码块处理绘制参考对象和我们当前正在检查的对象周围的轮廓,然后构造refCoords 和 objCoords ,使得(1)边界框坐标和(2)的 (x,y) -坐标质心包含在相同的数组中
![84c76305fc401ad4e51b4e322492416c.png](https://i-blog.csdnimg.cn/blog_migrate/8ad8955707964b3b085558ee824c5f68.jpeg)
我们现在准备计算图像中各个角和物体质心之间的距离
![ac8a4f7206e6d556b6c01bbfebc838be.png](https://i-blog.csdnimg.cn/blog_migrate/07a8435d3b348b545552d5607dfcb0d9.jpeg)
在第94行,我们开始循环对应于我们的参考对象和 有用对象的 (x,y)坐标 对。
然后,我们绘制一个圆圈,表示当前点的 (x,y)坐标,我们正在计算它们之间的距离,并绘制一条线来连接点(第97-110行)。
从那里, 105行计算参考位置和物体位置之间的欧几里德距离,然后将距离除以“每度量像素”,得到两个物体之间的最终距离(英寸)。然后在我们的图像上绘制计算的距离(第106-108行)。注意:此距离计算是针对左上角,右上角,右下角,左下角和质心坐标中的每一个执行的,总共进行 五次距离比较。
最后, 第111行和第112行将输出图像显示在我们的屏幕上。
距离测量结果
要尝试使用距离测量脚本,请使用本教程底部的“下载”表单将源代码和相应的图像下载到此帖子。解压 。zip 文件,将目录更改为 distance_between 。py 脚本,然后执行以下命令$ python distance_between.py --image images/example_01.png --width 0.955
下面是一个演示我们脚本输出的GIF动画:
图2:使用OpenCV计算图像中对象之间的距离。
在每种情况下,我们的脚本匹配左上角 (红色),右上角 (紫色),右下角 (橙色),左下角 (蓝绿色)和质心 (粉红色)坐标,然后计算参考对象和当前对象之间 距离 (以英寸为单位)。
注意图像中的两个硬币是如何完全相互平行的,这意味着所有五个控制点之间的距离是6.1英寸。
下面是第二个例子,这次计算我们的参考对象和一组药丸之间的距离$ python distance_between.py --image images/example_02.png --width 0.955
图3:使用OpenCV计算药丸之间的距离。
该示例可以用作药丸分拣机器人的输入,该机器人自动地取一组药丸并根据药丸容器的尺寸和距离来组织它们。
我们的最后一个例子计算了我们的参考对象(一张3.5英寸x 2英寸名片)和一套7英寸黑胶唱片和一个信封之间的距离$ python distance_between.py --image images/example_03.png --width 3.5
图4:使用OpenCV和计算机视觉计算对象之间距离的最后一个示例。
如您所见,在每种情况下,我们都成功计算出图像中对象之间的距离(实际可测量单位)。
摘要
在我们关于测量物体尺寸的系列的第三部分也是最后一部分中,我们学习了如何在图像中拍摄两个不同的物体,并以实际可测量的单位(例如英寸,毫米等)计算它们之间的距离 。
正如我们在上周的帖子中发现的那样,在我们能够(1)计算对象的大小或(2)测量两个对象之间的距离之前,我们首先需要计算“每度量像素”比率,用于确定有多少像素“适合”到给定的测量单位。一旦我们有了这个比率,计算物体之间的距离几乎是非常容易的。
我希望你喜欢今天的帖子
代码下载
源代码下载
原文链接
距离测量 使用 OpenCV 测量 图像中 对象 之间的 距离hotdog29.com
文章转自 Adrian Rosebrock ,OpenCV Face Recognition,PyImageSearch,https://www.pyimagesearch.com/Holistically-Nested Edge Detection with OpenCV and Deep Learning/,2009年7月31日访问
相关文章
- 大小检测 使用 OpenCV 测量图像中对象的大小
- Mask R-CNN Keras 对象检测 对象分割 像素掩码
- YOLO 对象检测 OpenCV 源代码
- 银行卡号识别 基于 OpenCV 光学字符识别(OCR)
- 图像着色 使用 OpenCV ,深度学习 进行 黑白图像着色
张贴在技术博客、opencv标签:opencv、对象检测、距离测量、图像检测编辑