目录

  • 一、场景需求解读
  • 二、算法原理简介
  • 三、算法实现步骤
  • 四、算法代码实现
  • 五、算法效果展示与分析
  • 参考资料
  • 注意事项

一、场景需求解读

  在现实场景中,我们可能会遇到这个问题,即需要自动的测量图像中的不同目标之间的距离。通过这个测量,我们可以明确的知道图像中各个目标的位置以及各个目标之间的距离,便于我们做出合理的规划。本文是在该博客的基础上面进行拓展而来的。下图展示了一个样例图片,即图中最左边的是我们的参考目标,我们需要做的就是自动的确定当前的参考目标和其它对象之间的距离。

二、算法原理简介

   整个算法的核心是根据参考目标的实际距离和欧式距离计算出相应的像素比。首先需要进行一系列的像素预处理操作,包括灰度变换,高斯滤波,边缘检测等;然后使用轮廓检测算法获取到图中的参考目标和其它目标;最后将像素比分别应用在参考目标和其它目标之间的4个顶点和中心点上面。

三、算法实现步骤

步骤1-读取输入图片;
步骤2-执行灰度变换;
步骤3-进行高斯滤波去除一部分噪声;
步骤4-执行Canny边缘检测来获取目标的边缘映射,并使用膨胀和腐蚀操作来进行后处理;
步骤5-在边缘映射中寻找合适的轮廓;
步骤6-计算轮廓的外接矩形,并对轮廓进行排序;
步骤7-根据参考目标和实际距离的大小来计算出像素比
步骤8-根据参考目标和其它目标之间的坐标信息计算并显示结果。

四、算法代码实现

# coding=utf-8
# 导入相应的pthon包
from scipy.spatial import distance as dist
from imutils import perspective
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2# 计算中心点函数
def midpoint(ptA, ptB):return ((ptA[0] + ptB[0]) * 0.5, (ptA[1] + ptB[1]) * 0.5)# 进行参数配置和解析
ap = 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())# 读取图片
image = cv2.imread(args["image"])
# 执行灰度变换
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 执行高斯滤波
gray = cv2.GaussianBlur(gray, (7, 7), 0)# 执行Canny边缘检测
edged = cv2.Canny(gray, 50, 100)
# 执行腐蚀和膨胀后处理
edged = cv2.dilate(edged, None, iterations=1)
edged = cv2.erode(edged, None, iterations=1)# 在边缘映射中寻找轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)# 对轮廓点进行排序
(cnts, _) = contours.sort_contours(cnts)
# 设置显示颜色
colors = ((0, 0, 255), (240, 0, 159), (0, 165, 255), (255, 255, 0), (255, 0, 255))
refObj = None# 循环遍历每一个轮廓点
for c in cnts:# 过滤点太小的轮廓点if cv2.contourArea(c) < 100:continue# 计算最小的外接矩形box = cv2.minAreaRect(c)box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)box = np.array(box, dtype="int")# 对轮廓点进行排序box = perspective.order_points(box)# 计算BB的中心点cX = np.average(box[:, 0])cY = np.average(box[:, 1])if refObj is None:# 获取4个坐标点并计算中心点坐标(tl, tr, br, bl) = box(tlblX, tlblY) = midpoint(tl, bl)(trbrX, trbrY) = midpoint(tr, br)# 计算中心点之间的欧式距离D = dist.euclidean((tlblX, tlblY), (trbrX, trbrY))# 获取计算结果refObj = (box, (cX, cY), D / args["width"])continue# 绘制轮廓orig = 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)# 进行坐标堆叠refCoords = np.vstack([refObj[0], refObj[1]])objCoords = np.vstack([box, (cX, cY)])# 遍历所有的坐标点for ((xA, yA), (xB, yB), color) in zip(refCoords, objCoords, colors):# 绘制点并连接为直线cv2.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)# 计算坐标之间的欧式距离并及进行距离转换D = 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)# 显示结果cv2.imshow("Image", orig)cv2.waitKey(0)

五、算法效果展示与分析

python distance_between.py --image images/example_01.png --width 0.955

python distance_between.py --image images/example_02.png --width 0.955

python distance_between.py --image images/example_03.png --width 3.5

  上图展示了不同图片的测试结果。通过上面的观察,我们可以获得一些有用的信息,即该算法可以准确的检测到不同的目标,并计算出参考目标和其它目标之间的距离,具体包括4个顶点和中心点之间的距离。通过以上的操作,我们就可以明确的知道图中各个目标之间的相对距离。

参考资料

[1] 参考链接

注意事项

[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注.
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本文测试的图片可以通过该链接进行下载。网盘链接- 提取码:vd2t 。
[5] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊,备注“项目”!!!

Python+Opencv测量物体之间的距离相关推荐

  1. 使用Python+OpenCV+detectorn2实现社交距离检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 介绍 美国和欧洲的许多城市现在都在谨慎地重新开放.人们被要求在外出 ...

  2. 如何使用OpenCV测量图像中物体之间的距离

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文来自光头哥哥的博客[Measuring distance be ...

  3. python+opencv实现机器视觉基础技术(2)(宽度测量,缺陷检测,医学检测

     本篇博客接着讲解机器视觉的有关技术和知识.包括宽度测量,缺陷检测,医学处理. 一:宽度测量   在传统的自动化生产中,对于尺寸的测量,典型的方法就是千分尺.游标卡尺.塞尺等.而这些测量手段测量精度低 ...

  4. 使用Python,OpenCV生成Aruco标记

    这篇博客将介绍Aruco标记是什么,以及如何使用Python,OpenCV生成Aruco标记.本文提供俩种生成方式:在线生成和代码生成: 使用OpenCV处理ArUco标签非常简单,因为OpenCV库 ...

  5. python opencv单目测距 小孔成像原理

    python opencv单目测距 小孔成像原理 小孔成像原理 代码 opencv>3.x 小孔成像原理 一 用相似三角形计算物体或者目标到相机的距离 我们将使用相似三角形来计算相机到一个已知的 ...

  6. 使用几何光学实现空间相对定位(python+opencv)

    我从2019年3月份开始学习python,在有一定的基础后,我看到学校有一个物理实验竞赛:北京联合大学第十二届物理实验竞赛,其中有一个题目是空间定位,即利用物理原理,自行搭建实验装置,实现物体的空间定 ...

  7. 使用OpenCV测量图像中物体的大小

    本文翻译自pyimagesearch技术博客上的一篇文章,<Measuring size of objects in an image with OpenCV>,原文作者:Adrian R ...

  8. Python+OpenCv实现AI人脸识别身份认证系统(1)——人脸识别原理

    原 Python+OpenCv实现AI人脸识别身份认证系统(1)--人脸识别原理 置顶 2019年07月02日 08:47:40 不脱发的程序猿 阅读数 1255更多 所属专栏: 人脸识别身份认证系统 ...

  9. Python OpenCV应用K均值聚类进行颜色量化

    Python OpenCV应用K均值聚类进行颜色量化 1. 效果图 2. 颜色量化是什么? 3. MiniBatchKMeans & KMeans 4. 源码 参考 在这篇博客文章中,我将向您 ...

最新文章

  1. php连接Mysql
  2. png库结合zlib库使用出现的一个链接问题的解决
  3. echarts统计x轴区间的数值
  4. android fitsSystemWindows的使用
  5. 【DP】【Asia - Harbin - 2010/2011】【Permutation Counting】
  6. PHP MySQL Functions (PDO_MYSQL)
  7. 【报告分享】快手、抖音、视频号对比,竞争趋紧,运营体系成关键.pdf(附下载链接)...
  8. 已解决——pycharm在同目录下import,pycharm会提示错误,但是可以运行
  9. Access操作的注意事项
  10. 【简报】帮助开发人员在线了解CSS Filter特性的工具 - CSS FilterLab
  11. Java并发编程实战_Java并发编程实战
  12. java 阿拉伯数字日期转换为中文大写日期方法_日期转换为中文大写数字
  13. ubuntu下的libfetion飞信
  14. opboot怎么刷入固件_竞斗云系列四:Opboot1.09+128M固件刷机
  15. (KWS-LSTM)Max-pooling loss training of long short-term memory networks for small-footprint keyword s
  16. 代码审计--13--源代码审计思路(下)
  17. 福州师范大学计算机专业导师简介,黄欣沂_福建师范大学研究生导师信息
  18. java ipone 微信昵称emoji表情保存失败 无法存入数据库
  19. android 系统儿童锁,儿童锁-家长助手
  20. gin-gonic/gin使用详解

热门文章

  1. linux判断文件写入完毕,linux文件编程——系统调用(打开、写入、读取、访问判断)...
  2. python统计提取数量_python中统计计数的几种方法和Counter的介绍
  3. howdoi 简单分析
  4. Citrix XenApp应用虚拟化之RTX串号问题解决
  5. 使用 Cockpit 方便地管理容器
  6. MYSQL--事务处理
  7. POJ 1743 (后缀数组+不重叠最长重复子串)
  8. php实现网站插件机制的方法
  9. 《微软产品开发致胜策略》-5月22日微软CTO峰会主题演讲
  10. orcale实现自定义优先级排序的SQL