• 什么是轮廓
  • 找轮廓、绘制轮廓等

1.什么是轮廓

  轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度。轮廓在形态分析和物体的检测和识别中很有用。

  • 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者Canny边界检测。
  • 查找轮廓的函数会修改原始图像。如果に在找到轮廓后还想使用原始图像的话,应该把原始图像存储到其他变量中。
  • 在OpenCV中,查找轮廓就像是在黑色背景中找白色物体,要记住要找的物体应该是白色而背景应该是黑色

让我们看看如何在一个二值图像中查找轮廓:

  cv2.findContours()有3个参数,第一个是输入图像,第二个是轮廓检索模式,第三个是轮廓近似方法。返回值有三个,第一个是图像,第二个是轮廓,第三个是(轮廓的)层析结构。第二个返回值轮廓是一个Python列表,其中存储这图像中的所有轮廓。每一个轮廓都是一个Numpy数组,包含对象边界点(x,y)的坐标。

2.怎样绘制轮廓

  cv2.drawContour()可以用来绘制轮廓。你可以根据你提供的边界点绘制任何形状。它的第一个参数是原始 图像,第二个参数是轮廓,一个Python列表。第三个参数是轮廓的索引(在绘制独立轮廓时相当有用,当设置为-1时将绘制所有轮廓)。接下来的参数是轮廓的颜色,厚度等。

  一下例程在一幅图中绘制所有的轮廓:

# -*- coding:utf-8 -*-

import numpy as npimport  cv2from matplotlib import pyplot as plt

im = cv2.imread('2.jpg')imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(imgray,200,255,cv2.THRESH_BINARY_INV)cv2.imshow('img1',thresh)

img,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#以上设置是较为通用的用法,后面会讲到一些具体的设置参数#这一步会把thresh变为轮廓图,即与img相同;然而不断试验并没发现thresh发生任何变化#网上有说这个函数只有两个返回值的,但试过会报错

cv2.drawContours(im,contours,-1,(0,0,255),1)#这一步会把轮廓线画在im中

print(len(contours))#可以看到一共绘制出了多少个轮廓cv2.imshow('img',im)cv2.waitKey(0)

效果如下

3.轮廓的近似方法

  表示这个设置的是cv2;findCountours()的第三个参数。之前我们提到轮廓是一个形状具有相同灰度值的边界,它会存储形状边界上所有的(x,y)坐标。但是需要将这所有的边界点都存储么?这就是这个设置参数改变的东西。

  这个参数如果设置为cv2.CHAIN_APPROX_NONE,则所有的边界点都会被存储。但是有的时候,比如边界是一条直线的时候,我们并不需要这么多的点来表示直线,只需要这条直线的端点就够了。这就是cv2.CHAIN_APPROX_SIMLE做的。它会把轮廓上的冗余点都去掉,以压缩轮廓节省内存开支。

P.S 几个参数的物理含义

cv2.findCountours():

 输入的第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
    cv2.RETR_EXTERNAL表示只检测外轮廓
    cv2.RETR_LIST检测的轮廓不建立等级关系
    cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
    cv2.RETR_TREE建立一个等级树结构的轮廓

输出的的参数中,

  hierarchy :这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。

转载于:https://www.cnblogs.com/zodiac7/p/9286531.html

OpenCV学习笔记(12)——OpenCV中的轮廓相关推荐

  1. OpenCV学习笔记#002 OpenCV相机检校例程运行

    OpenCV学习笔记#002 OpenCV相机检校例程运行 OpenCV学习笔记#002 OpenCV相机检校例程运行 所需文件 修改文件 修改in_VID5.xml 修改VID5.xml VS 设置 ...

  2. opencv学习笔记12:图像腐蚀和图像膨胀

    语言:python+opencv 为什么使用图像腐蚀和图像膨胀 如图,使用图像腐蚀进行去噪,但是为压缩噪声. 对腐蚀过的图像,进行膨胀处理,可以去除噪声,并保持原样形状. 图像腐蚀 腐蚀主要针对的是二 ...

  3. OpenCV学习笔记(六)之轮廓提取与角度测量

      查找图像的轮廓在图像处理及应用中扮演着重要的角色.openCV 中的轮廓指的是由一系列点组成的点的集合,不同的轮廓可以有不同的点集.openCV中,轮廓是由STL风格的vector<> ...

  4. OpenCV学习笔记之OpenCV安装

    一.  Opencv的安装及配置 Qt有两种版本:mingw版本和MSVC版本.1.MSVC是指微软的VC编译器:2.MinGW是指是Minimalist GNU on Windows的缩写.它是一个 ...

  5. OpenCV学习笔记(Python)———— 画轮廓

    画轮廓 : 1)运用cv2.findContours()函数 import cv2# 读取数据 mupian = cv2.imread(r"图片地址,例:E:\dataset\train\i ...

  6. OpenCV学习笔记(Python)———— 主动轮廓模型

    本文包含主动轮廓模型代码以及实例分割代码 原图: 效果图: 主动轮廓模型: morphsnakes.py # -*- coding: utf-8 -*- """ ==== ...

  7. Opencv学习笔记之OpenCV介绍

    一.  OpenCV介绍 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 ...

  8. Opencv学习笔记 - 关于OpenCV的UMat 类

    一个统一的抽象 cv::UMat 允许使用 CPU 或 OpenCL 代码实现相同的 API,而无需显式调用 OpenCL 加速版本.UMat类告诉 OpenCV 函数使用特定于 OpenCL 的代码 ...

  9. 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版)

    经过几天的学习,opencv基础部分学习完啦.整理出来. OpenCV opencv学习笔记1:图片读入,显示与保存(有代码) opencv学习笔记2:图像处理基础 opencv学习笔记3:像素处理 ...

最新文章

  1. rsync+sersync实现数据文件实时同步
  2. 1067. [SCOI2007]降雨量【线段树】
  3. iOS/OS X内存管理(一):基本概念与原理
  4. python 2022/1/2
  5. 恒驰机器人_机器人如何造恒驰?探秘最牛汽车生产基地
  6. asp.net的几种页面间的传值方法
  7. sqlite3 交叉编译出现configure: error: C compiler cannot create executables
  8. SIGIR 2020 | 知识图谱上推荐推理的模仿学习框架
  9. logback日志pattern_Logback 配置文件这么写,TPS提高10倍
  10. MacBook Pro 用户学会这 5 个小技巧,让你的 Touch Bar 更好用
  11. Unity AI 之 行为树 的简单介绍
  12. Word删除页眉横线的方法
  13. IGRP和EIGRP 详解
  14. 你的爬虫是否徘徊在违法的边缘?
  15. 台式计算机系统重新安装软件,教你台式机如何重装系统
  16. 峰会/论坛现场签约怎么签?君子签提供区块链电子签约技术支持
  17. C语言数组初始化为非0值
  18. JEPF 软件快速开发平台
  19. unix时间戳转化为时间格式(C代码实现:2种方式)
  20. SYMBIAN Carbide C++ sisx真机程序生成过程

热门文章

  1. 将文件上传至ftp服务器,FTP文件上传工具类,将文件上传至服务器指定目录
  2. Go 知识点(08) — 对未初始化的 channel 进行读写操作
  3. Python+OpenCV 图像处理系列(3)—— 画线、矩形、画圆、画椭圆、画多边形
  4. jquery autocomplete demo
  5. pytorch的backward
  6. 基于Vue开发的购物车案例
  7. MinkowskiPooling池化(下)
  8. Hashing散列注意事项
  9. 从C到C++过渡的3个原因
  10. 2021年大数据常用语言Scala(二十七):函数式编程 聚合操作