目标

  • 了解轮廓是什么。

  • 学习查找轮廓,绘制轮廓等。

  • 你将看到以下功能:cv.findContours(),cv.drawContours()

什么是轮廓?

轮廓可以简单地解释为连接具有相同颜色或强度的所有连续点(沿边界)的曲线。轮廓是用于形状分析以及对象检测和识别的有用工具。

  • 为了获得更高的准确性,请使用二进制图像。因此,在找到轮廓之前,请应用阈值或canny边缘检测。

  • 从OpenCV 3.2开始,findContours()不再修改源图像。

  • 在OpenCV中,找到轮廓就像从黑色背景中找到白色物体。因此请记住,要找到的对象应该是白色,背景应该是黑色。

让我们看看如何找到二进制图像的轮廓:

import numpy as np
import cv2 as cv
im = cv.imread('test.jpg')
imgray = cv.cvtColor(im, cv.COLOR_BGR2GRAY)
ret, thresh = cv.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv.findContours(thresh, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)

findcontour()函数中有三个参数,第一个是源图像,第二个是轮廓检索模式,第三个是轮廓逼近方法。输出等高线和层次结构。轮廓是图像中所有轮廓的Python列表。每个单独的轮廓是一个(x,y)坐标的Numpy数组的边界点的对象。

注意
稍后我们将详细讨论第二和第三个参数以及有关层次结构。在此之前,代码示例中赋予它们的值将适用于所有图像。

如何绘制轮廓?

要绘制轮廓,请使用cv.drawContours函数。只要有边界点,它也可以用来绘制任何形状。它的第一个参数是源图像,第二个参数是应该作为Python列表传递的轮廓,第三个参数是轮廓的索引(在绘制单个轮廓时有用。要绘制所有轮廓,请传递-1),其余参数是颜色,厚度等等

  • 在图像中绘制所有轮廓:

    cv.drawContours(img, contours, -1, (0,255,0), 3)
  • 绘制单个轮廓,如第四个轮廓:

    cv.drawContours(img, contours, 3, (0,255,0), 3) 
  • 但是在大多数情况下,以下方法会很有用:

    cnt = contours[4]
    cv.drawContours(img, [cnt], 0, (0,255,0), 3)

注意
最后两种方法相似,但是前进时,您会发现最后一种更有用。

轮廓近似方法

这是cv.findContours函数中的第三个参数。它实际上表示什么?

上面我们告诉我们轮廓是强度相同的形状的边界。它存储形状边界的(x,y)坐标。但是它存储所有坐标吗?这是通过这种轮廓近似方法指定的。

如果传递cv.CHAIN_APPROX_NONE,则将存储所有边界点。但是实际上我们需要所有这些要点吗?例如,您找到了一条直线的轮廓。您是否需要线上的所有点来代表该线?不,我们只需要该线的两个端点即可。这就是cv.CHAIN_APPROX_SIMPLE所做的。它删除所有冗余点并压缩轮廓,从而节省内存。

下面的矩形图像演示了此技术。只需在轮廓数组中的所有坐标上绘制一个圆(以蓝色绘制)。第一幅图像显示了我用cv.CHAIN_APPROX_NONE获得的积分(734个点),第二幅图像显示了我用cv.CHAIN_APPROX_SIMPLE获得的效果(只有4个点)。看,它可以节省多少内存!!!

☆☆☆为方便大家查阅,小编已将OpenCV-Python专栏文章统一整理到公众号底部菜单栏,同步更新中,关注公众号,点击左下方“文章”,如图:

或点击下方“阅读原文”,进入OpenCV-Python专栏,即可查看系列文章。

不断更新资源

获取更多精彩

长按二维码扫码关注

OpenCV系列之轮廓入门 | 二十一相关推荐

  1. opencv函数findcontours_OpenCV系列之轮廓入门 | 二十一

    目标 了解轮廓是什么. 学习查找轮廓,绘制轮廓等. 你将看到以下功能:cv.findContours(),cv.drawContours() 什么是轮廓? 轮廓可以简单地解释为连接具有相同颜色或强度的 ...

  2. OpenCV系列之轮廓分层 | 二十五

    目标 这次我们学习轮廓的层次,即轮廓中的父子关系. 理论 在前几篇关于轮廓的文章中,我们已经讨论了与OpenCV提供的轮廓相关的几个函数.但是当我们使用cv.findcontour()函数在图像中找到 ...

  3. OpenCV系列之轮廓属性 | 二十三

    在这里,我们将学习提取一些常用的物体属性,如坚实度,等效直径,掩模图像,平均强度等.更多的功能可以在Matlab regionprops文档中找到. (注:质心.面积.周长等也属于这一类,但我们在上一 ...

  4. java 案例 一千例,【发现问题、解决问题系列案例分享(二十一)】 一个自动执行命令,每天节省一千分钟!...

    原标题:[发现问题.解决问题系列案例分享(二十一)] 一个自动执行命令,每天节省一千分钟! 编辑 | 林采依 撰文 |钱奕昀 嘉定局 在用户信息安全检测中,营业厅电脑因受理业务时需使用安真通 无纸化拍 ...

  5. OpenCV系列之轮廓:更多属性 | 二十四

    目标 在本章中,我们将学习 凸性缺陷以及如何找到它们 查找点到多边形的最短距离 匹配不同的形状 理论和代码 1. 凸性缺陷 我们看到了关于轮廓的第二章的凸包.从这个凸包上的任何偏差都可以被认为是凸性缺 ...

  6. OpenCV系列之级联分类器 | 六十一

    目标 在本教程中, 我们将学习Haar级联对象检测的工作原理. 我们将使用基于Haar Feature的Cascade分类器了解人脸检测和眼睛检测的基础知识. 我们将使用cv::CascadeClas ...

  7. OpenCV系列之模板匹配 | 三十一

    目标 在本章中,您将学习 使用模板匹配在图像中查找对象 你将看到以下功能:cv.matchTemplate(),cv.minMaxLoc() 理论 模板匹配是一种用于在较大图像中搜索和查找模板图像位置 ...

  8. OpenCV系列之图像金字塔 | 二十

    目标 在本章中, 我们将学习图像金字塔 我们将使用图像金字塔创建一个新的水果"Orapple" 我们将看到以下功能:cv.pyrUp(),cv.pyrDown() 理论 通常,我们 ...

  9. OpenCV精进之路(二十一):实例——去除发票上的印章

    最近在做票据识别的编码工作时遇到一些问题,就是票据上往往会有一些红色印章把一些重要信息区域给覆盖了,比如一些开发票人员盖印章时比较随意,容易吧一些关键区域给遮蔽了,这让接下来的票据识别很困难,因此,我 ...

最新文章

  1. 20种看asp源码的方法及工具
  2. firefox下的调试工具
  3. 人的价值不在于能力,而在于位置 » 社区 | Ruby China
  4. Erlang OTP学习(3) supervisor
  5. 使用JavaFX AnimationTimer
  6. 【CodeForces - 215A】Bicycle Chain (水题)
  7. AD封装库的免费下载与导入
  8. 001云E办项目之创建项目
  9. 用matlab求得矩阵的最大特征值
  10. matlab 加上划线,latex 上划线
  11. 谷歌gmail注册入口_如何更改,恢复,重设Gmail,Google云端硬盘,Android,Chrome的Google帐户密码?...
  12. 使用 FFmpeg(bilibili视频m4s合成mp4)
  13. 分享我用Qt写的游戏组队群聊系统
  14. 用业绩倒逼技术发展,小i机器人朱频频:AI价值不仅在于IPO
  15. invalid use of non-static member function
  16. 一些可以参考文章集合2
  17. 硬仗酱酒:让大众共享硬仗好酒,让时代见证硬仗精神
  18. 计算机控制菜单在哪里,电脑控制面板在哪里打开(控制面板怎么设置邮件)
  19. 插值、平稳假设、本征假设、变异函数、基台、块金、克里格、线性无偏最优…地学计算概念及公式推导
  20. P4799 [CEOI2015 Day2]世界冰球锦标赛

热门文章

  1. CNCC2022全面启动,共同期待贵阳相聚!
  2. python获取文件后缀_Python使用filetype精确判断文件类型 (文件类型获取)
  3. 浏览器工作原理及相关内核、技术介绍
  4. 学习高等数学一个月记录
  5. DSP、Actel转接板标准电路
  6. Python邮箱提醒
  7. SQLZOO——JOIN Quiz 2
  8. HTML 5.1的新增功能
  9. 《学籍信息管理系统》java+mysql+gui实现(全套免费代码+保姆教学+60页实验报告)
  10. 视频制作软件——会声会影的使用心得