上一篇博客,我们学习了如何利用Python、OpenCV计算轮廓的中心,这一节学习仅运用轮廓的基本属性来检测其形状,三角形,正方形,矩形,五边形,圆。

(1)利用轮廓逼近,将曲线上的点数减少为更简单的近似版本的过程。
(2)基于该轮廓逼近,检查每种形状具有的顶点数量。有了顶点数,就能准确地标记每个形状。三个点——三角形,四个点(结合宽高比确定矩形和正方形),5个点五边形,其他的结合膨胀腐蚀假设其为圆;

# python detect_shapes.py --image shapes_and_colors.png# 导入必要的包
import argparse
import imutils
import cv2class ShapeDetector:def __init__(self):pass# 轮廓形状识别器 只有一个参数 c:轮廓# 为了进行形状检测,我们将使用轮廓近似法。 顾名思义,轮廓近似(contour approximation)是一种算法,用于通过减少一组点来减少曲线中的点数,因此称为术语近似。# 轮廓近似是基于以下假设:一条曲线可以由一系列短线段近似。这将导致生成近似曲线,该曲线由原始曲线定义的点子集组成。# 轮廓近似实际上已经通过cv2.approxPolyDP在OpenCV中实现。def detect(self, c):# 初始化形状名称,使用轮廓近似法shape = "unidentified"# 计算周长peri = cv2.arcLength(c, True)approx = cv2.approxPolyDP(c, 0.04 * peri, True)# 轮廓是由一系列顶点组成的;如果是三角形,将拥有3个向量if len(approx) == 3:shape = "triangle"# 如果有4个顶点,那么是矩形或者正方形elif len(approx) == 4:# 计算轮廓的边界框 并且计算宽高比(x, y, w, h) = cv2.boundingRect(approx)ar = w / float(h)# 正方形的宽高比~~1 ,否则是矩形shape = "square" if ar >= 0.95 and ar <= 1.05 else "rectangle"# 如果是五边形(pentagon),将有5个顶点elif len(approx) == 5:shape = "pentagon"# 否则,根据上边的膨胀腐蚀,我们假设它为圆形else:shape = "circle"# 返回形状的名称return shape# 构建命令行参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,help="path to the input image")
args = vars(ap.parse_args())# 加载图片 保持宽高比并resize到一个比较小的大小,以使其有更好的轮廓近似结果
image = cv2.imread(args["image"])
resized = imutils.resize(image, width=300)
ratio = image.shape[0] / float(resized.shape[0])# 转换为灰度图 高斯平滑减少高频噪音 二值化图像
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)[1]# 在阈值图像上进行形状检测,并初始化形状检测器
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# 兼容opencv版本获取正确的轮廓结果
cnts = imutils.grab_contours(cnts)
sd = ShapeDetector()# 注意图像是如何二值化的-形状在黑色背景上显示为白色前景。
# 循环遍历每个轮廓,对每个轮廓执行形状检测,然后在对象上绘制形状的名称。
for c in cnts:# 计算轮廓的中心,应用轮廓检测其形状M = cv2.moments(c)cX = int((M["m10"] / M["m00"]) * ratio)cY = int((M["m01"] / M["m00"]) * ratio)shape = sd.detect(c)# 还原原始的轮廓大小# 将轮廓* 缩放的ratio比例 并将其绘制在图像上,同时将形状的标签文本绘制在图像上c = c.astype("float")c *= ratioc = c.astype("int")cv2.drawContours(image, [c], -1, (0, 255, 0), 2)cv2.putText(image, shape, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX,0.5, (255, 255, 255), 2)# 展示输出图片cv2.imshow("Image", image)cv2.waitKey(0)

参考:
https://www.pyimagesearch.com/2016/02/08/opencv-shape-detection/

Python,OpenCV应用轮廓逼近算法,检测对象的形状相关推荐

  1. Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm)

    Python+OpenCV:基于分水岭算法的图像分割(Image Segmentation with Watershed Algorithm) ############################ ...

  2. Python OpenCV Tesseract实现车牌的检测与识别

    python+opencv+TESSERT-OCR实现车牌的检测与识别_啥都不会的小王的博客-CSDN博客python+opencv+TESSERT-OCR实现车牌的检测与识别开学花了十天时间0基础搞 ...

  3. 使用Python+OpenCV+yolov5实现行人目标检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自 | 深度学习与计算机视觉 介绍 目标检测支持许多视觉任务 ...

  4. Python+Opencv图像处理--基于OTSU+凸包检测的粘连大米分割

    文章目录 前言 1.分割流程图 2.图像预处理 2.1 改进二值化算法 2.2 形态学运算 3.提取轮廓 4.凸包检测 5.标记大米 前言 转载请注明本文出处. 最近一段时间一直在看粘连分割,网上也有 ...

  5. [转载] 使用Python+OpenCV实现在视频中某对象后添加图像

    参考链接: Python Opencv 基础3 : resize 调整图像大小 概述 在运动物体后面添加图像是一个典型的计算机视觉项目了解如何使用传统的计算机视觉技术在视频中添加logo 介绍 我的一 ...

  6. 基于OpencV的轮廓填充算法在3D打印机中的应用

    在这之前,我们需要了解一下SLC文件的格式,只有对格式有一点了解,我们才能做接下来的工作,首先SLC文件中是通过描述各层中的多段线来描述整个模型的,多段线之间两两相连.对单个轮廓来说,最后一点必须等于 ...

  7. opencv c++ 轮廓逼近与拟合

    1.概念   轮廓逼近:指用越来越多的多边形对轮廓进行拟合,从而获得与轮廓近似的多边形,并获取多边形的形状.目的是为了减少编码点(人话:减少数据量)   拟合:生成最相似的圆或多边形. 2.代码 AP ...

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

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

  9. Python+Opencv实现实时的条形码检测

    目录 一.场景需求简介 二.算法实现步骤 三.图片中条形码检测代码实现 四.图片中条形码检测效果展示与分析 五.视频中条形码检测代码实现 六.视频中条形码检测效果展示与分析 七.思维扩展 参考资料 注 ...

最新文章

  1. java super this_Java this和super的区别和应用
  2. 2020年1月份学习总结,死线(Deadline)杀死团队拖延症
  3. 被App Store拒绝的N个原因
  4. 新冠病例继续攀升 苹果关闭纽约市所有实体店
  5. 浅析:18个影响网站流量下降的原因!
  6. 这篇文章是我用AI生成出来的
  7. layui调用相册功能和点击按钮调用相册功能
  8. 路由器当交换机用的设置方法
  9. 洪恩教育披露2020年报:学习服务收入大增,营销费、负债规模攀升
  10. excel文档查询服务器,excel服务器数据库查询语句
  11. 猿创征文 |汇编语言基础知识
  12. 干货!学习 Python 看这篇管够!!!
  13. Emacs Lisp语言
  14. Python、Cython、CPython的简单对比
  15. 【已解决】WPS/OFFICE中word文件可以打印,excel打印后无响应
  16. 一次光纤线路故障导致的光纤猫信号灯异常用户无法上网的故障解决过程
  17. html中stroke函数,HTML中stroke是什么意思?
  18. python输出假分数_解析ArcGis的标注(一)——先看看分数式、假分数式标注是怎样实现的...
  19. 2021-2027全球与中国碲化镉薄膜太阳能电池市场现状及未来发展趋势
  20. dubbo消费端如何找到服务端对象,进行方法调用的

热门文章

  1. HDR sensor 原理介绍
  2. C++ namespace 的作用以及使用
  3. adb install -r ,-d 等的解释
  4. Git 头指针分离与 FETCH_HEAD
  5. HBuilder 的快捷键
  6. Android studio怎么找到当前文件在电脑路径位置
  7. 设计模式中的六大基本原则
  8. SQL*Plus 系统变量之15 - DESC[RIBE]
  9. Maven的setting.xml配置文件详解(中文)
  10. 2022-2028年中国白手套行业市场全景调查及发展前景分析报告