目标

在本文中,我们将学习

  • 如何找到轮廓的不同特征,例如面积,周长,质心,边界框等。
  • 您将看到大量与轮廓有关的功能。

1. 特征矩

特征矩可以帮助您计算一些特征,例如物体的质心,物体的面积等。请查看特征矩上的维基百科页面。函数cv.moments()提供了所有计算出的矩值的字典。见下文:

  1. import numpy as np
  2. import cv2 as cv
  3. img = cv.imread('star.jpg',0)
  4. ret,thresh = cv.threshold(img,127,255,0)
  5. contours,hierarchy = cv.findContours(thresh, 1, 2)
  6. cnt = contours[0]
  7. M = cv.moments(cnt)
  8. print( M )

从这一刻起,您可以提取有用的数据,例如面积,质心等。质心由关系给出,Cx=M10M00C_x = \frac{M_{10}}{M_{00}}Cx​=M00​M10​​ 和 Cy=M01M00C_y = \frac{M_{01}}{M_{00}}Cy​=M00​M01​​。可以按照以下步骤进行:

  1. cx = int(M['m10']/M['m00'])
  2. cy = int(M['m01']/M['m00'])

2. 轮廓面积

轮廓区域由函数cv.contourArea()或从矩M['m00']中给出。

  1. area = cv.contourArea(cnt)

3. 轮廓周长

也称为弧长。可以使用cv.arcLength()函数找到它。第二个参数指定形状是闭合轮廓(True)还是曲线。

  1. perimeter = cv.arcLength(cnt,True)

4. 轮廓近似

根据我们指定的精度,它可以将轮廓形状近似为顶点数量较少的其他形状。它是Douglas-Peucker算法的实现。检查维基百科页面上的算法和演示。

为了理解这一点,假设您试图在图像中找到一个正方形,但是由于图像中的某些问题,您没有得到一个完美的正方形,而是一个“坏形状”(如下图所示)。现在,您可以使用此功能来近似形状。在这种情况下,第二个参数称为epsilon,它是从轮廓到近似轮廓的最大距离。它是一个精度参数。需要正确选择epsilon才能获得正确的输出。

  1. epsilon = 0.1*cv.arcLength(cnt,True)
  2. approx = cv.approxPolyDP(cnt,epsilon,True)

下面,在第二张图片中,绿线显示了ε=弧长的10%时的近似曲线。第三幅图显示了ε=弧长度的1%时的情况。第三个参数指定曲线是否闭合。

5. 轮廓凸包

凸包外观看起来与轮廓逼近相似,但不相似(在某些情况下两者可能提供相同的结果)。在这里,cv.convexHull()函数检查曲线是否存在凸凹缺陷并对其进行校正。一般而言,凸曲线是始终凸出或至少平坦的曲线。如果在内部凸出,则称为凸度缺陷。例如,检查下面的手的图像。红线显示手的凸包。双向箭头标记显示凸度缺陷,这是凸包与轮廓线之间的局部最大偏差。

关于它的语法,有一些需要讨论:

  1. hull = cv.convexHull(points[, hull[, clockwise[, returnPoints]]

参数详细信息:

  • 是我们传递到的轮廓。
  • 凸包是输出,通常我们忽略它。
  • 顺时针方向:方向标记。如果为True,则输出凸包为顺时针方向。否则,其方向为逆时针方向。
  • returnPoints:默认情况下为True。然后返回凸包的坐标。如果为False,则返回与凸包点相对应的轮廓点的索引。

因此,要获得如上图所示的凸包,以下内容就足够了:

  1. hull = cv.convexHull(cnt)

但是,如果要查找凸度缺陷,则需要传递returnPoints = False。为了理解它,我们将拍摄上面的矩形图像。首先,我发现它的轮廓为cnt。现在,我发现它的带有returnPoints = True的凸包,得到以下值:[[[234 202]],[[51 202]],[[51 79]],[[234 79]]],它们是四个角 矩形的点。现在,如果对returnPoints = False执行相同的操作,则会得到以下结果:[[129],[67],[0],[142]]。这些是轮廓中相应点的索引。例如,检查第一个值:cnt [129] = [[234,202]]与第一个结果相同(对于其他结果依此类推)。

当我们讨论凸度缺陷时,您将再次看到它。

6. 检查凸度

cv.isContourConvex()具有检查曲线是否凸出的功能。它只是返回True还是False。没什么大不了的。

  1. k = cv.isContourConvex(cnt)

7. 边界矩形

有两种类型的边界矩形。

7.a.直角矩形

它是一个矩形,不考虑物体的旋转。所以边界矩形的面积不是最小的。它是由函数cv.boundingRect()找到的。

(x,y)为矩形的左上角坐标,而(w,h)为矩形的宽度和高度。

  1. x,y,w,h = cv.boundingRect(cnt)
  2. cv.rectangle(img,(x,y),(x w,y h),(0,255,0),2)

7.b. 旋转矩形

这里,边界矩形是用最小面积绘制的,所以它也考虑了旋转。使用的函数是cv.minAreaRect()。它返回一个Box2D结构,其中包含以下细节 -(中心(x,y),(宽度,高度),旋转角度)。但要画出这个矩形,我们需要矩形的四个角。它由函数cv.boxPoints()获得

  1. rect = cv.minAreaRect(cnt)
  2. box = cv.boxPoints(rect)
  3. box = np.int0(box)
  4. cv.drawContours(img,[box],0,(0,0,255),2)

两个矩形都显示在一张单独的图像中。绿色矩形显示正常的边界矩形。红色矩形是旋转后的矩形。

8. 最小闭合圈

接下来,使用函数**cv.minEnclosingCircle(*()查找对象的圆周。它是一个以最小面积完全覆盖物体的圆。

  1. (x,y),radius = cv.minEnclosingCircle(cnt)
  2. center = (int(x),int(y))
  3. radius = int(radius)
  4. cv.circle(img,center,radius,(0,255,0),2)

9. 拟合一个椭圆

下一个是把一个椭圆拟合到一个物体上。它返回内接椭圆的旋转矩形。

  1. ellipse = cv.fitEllipse(cnt)
  2. cv.ellipse(img,ellipse,(0,255,0),2)

10. 拟合直线

同样,我们可以将一条直线拟合到一组点。下图包含一组白点。我们可以近似一条直线。

  1. rows,cols = img.shape[:2]
  2. [vx,vy,x,y] = cv.fitLine(cnt, cv.DIST_L2,0,0.01,0.01)
  3. lefty = int((-x*vy/vx) y)
  4. righty = int(((cols-x)*vy/vx) y)
  5. cv.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

欢迎关注磐创博客资源汇总站:

http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:

http://pytorch.panchuang.net/

OpenCV中文官方文档:

http://woshicver.com/

OpenCV-Python 轮廓特征 | 二十二的更多相关文章

  1. 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  2. 二十二. Python基础(22)--继承

    二十二. Python基础(22)--继承 ● 知识框架   ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A:     def get(s ...

  3. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  4. [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  5. 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用

    进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...

  6. JAVA基础知识总结:一到二十二全部总结

    >一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...

  7. 剑指Offer(二十二):从上往下打印二叉树

    剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...

  8. [分享] IT天空的二十二条军规

    Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...

  9. Bootstrap <基础二十二>超大屏幕(Jumbotron)

    Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...

  10. Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】

    <Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...

随机推荐

  1. Zookeeper的核心概念以及java客户端使用

    一.Zookeeper的核心概念 分布式配置中心(存储):disconf(zk).diamond(mysql+http) 1)znode ZooKeeper操作和维护的是一个个数据节点,称为 znod ...

  2. list转map,set,使用stream进行转化

    #list转map,set,使用stream进行转化 函数式编程: 场景: 从数据库中取出来的数据,经常是list集合类型,但是list转map这种场景虽然不常见,但是有时候也会遇到,最常见的还是转为 ...

  3. ef01

    1.ef简介 学习地址: https://www.entityframeworktutorial.net/ orm:Object relations mapping 对象关系映射 实体类中的属性与数据 ...

  4. Vue+Axios+iview+vue-router实战管理系统项目

    项目实现登陆验证,iviewui组件使用,vue-router路由拦截,在删除登陆存储的token后,直接路由进登陆页面,实战数据请求,本地data.json,笔者也是初出茅庐,在项目运行后,会一直c ...

  5. python框架Django实战商城项目之用户模块创建

    创建用户APP 整个项目会存在多个应用,需要存放在一个单独的文件包了,所以新建一个apps目录,管理所有子应用. 在apps包目录下穿件users应用 python ../../manage.py s ...

  6. spring boot 调度任务

    1.引入spring boot所依赖的jar包  <parent> <groupId>org.springframework.boot</groupId> < ...

  7. ALSA 声卡 驱动 linux 4.1.36 中变化

    linux 4.1.36 中变化 1ret = request_irq(IRQ_DMA2, s3c2440_dma2_irq, IRQF_DISABLED, "myalsa for play ...

  8. 五分钟用Docker快速搭建Go开发环境

    挺早以前在我写过一篇用 `Docker`搭建LNMP开发环境的文章:[用Docker搭建Laravel开发环境](http://mp.weixin.qq.com/s?__biz=MzUzNTY5MzU ...

  9. [android]com.android.support:appcompat-v7:XXX 包导入无法Build

    在学习<Android编程权威指南>时,按书中要求添加com.android.support:appcompat的依赖,然后编译不通过,提示如下问题: 大概意思是,Android Pie之 ...

  10. 数据挖掘入门系列教程(四点五)之Apriori算法

    目录 数据挖掘入门系列教程(四点五)之Apriori算法 频繁(项集)数据的评判标准 Apriori 算法流程 结尾 数据挖掘入门系列教程(四点五)之Apriori算法 Apriori(先验)算法关联 ...