OpenCV-Python(21):OPenCV查找及绘制轮廓

1.认识轮廓

1.1 目标

  • 理解什么是轮廓
  • 学习掌握找轮廓、绘制轮廓等
  • 学习使用cv2.findContours()、cv2.drawContours()函数的用法

1.2 什么是轮廓

        在OpenCV中,轮廓是图像中连续的边界线的曲线,具有相同的颜色或者灰度,用于表示物体的形状。轮廓在图像处理和计算机视觉中非常重要,常用于物体检测、形状分析、图像分割等任务。

提示:

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

在OpenCV中,可以通过以下步骤找到图像中的轮廓:

  1. 对图像进行预处理,如灰度化、二值化等操作。
  2. 使用cv2.findContours()函数找到图像中的轮廓。该函数会返回一个包含轮廓信息的列表。
  3. 遍历轮廓列表,可以使用cv2.drawContours()函数将轮廓绘制到图像上。
  4. 对轮廓进行进一步的分析和操作,如计算轮廓的面积、周长,寻找轮廓的凸包等。

cv2.findContours()是一个用于查找图像中轮廓的函数。它的语法如下:

contours, hierarchy = cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

参数说明:

  • image:输入的二值化图像,通常为灰度图像或二值图像。
  • mode:轮廓检索模式,指定轮廓的层级结构。常用的取值有:
    • cv2.RETR_EXTERNAL:只检测最外层的轮廓。
    • cv2.RETR_LIST:检测所有的轮廓,不建立层级关系。
    • cv2.RETR_CCOMP:检测所有的轮廓,并将它们组织为两层的层级结构。
    • cv2.RETR_TREE:检测所有的轮廓,并完整地重建轮廓之间的层级关系。
  • method:轮廓近似方法。常用的取值有:
    • cv2.CHAIN_APPROX_NONE:保存所有的轮廓点。
    • cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向上的轮廓,仅保留终点。
  • contours:输出的轮廓列表,每个轮廓由一系列点组成。
  • hierarchy:可选输出的层级关系,用于表示轮廓之间的层级关系。
  • offset:可选的偏移量,用于调整轮廓的位置。

4.0以上的版本cv2.findContours()函数会返回两个值(OpenCV 3.0系列版本会返回3个值,多出的第一个值是图像),分别是轮廓列表和层级关系。轮廓列表是一个包含每个轮廓的Numpy数组,每个数组中的元素表示轮廓上的一个点,包含对边界点(x,y)的坐标。层级关系是一个包含每个轮廓的层级关系信息的Numpy数组,用于表示轮廓之间的层级关系,可用于进一步分析轮廓的形状和结构。以下是一个使用cv2.findContours()函数查找轮廓的示例代码:

import cv2# 读取图像
image = cv2.imread("image.jpg")# 灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 三个参数的返回
'''
_,contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
'''# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)# 显示图像
cv2.imshow("Contours", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码中,首先读取了一张图像,并对其进行了灰度化和二值化处理。然后使用cv2.findContours()函数找到图像中的轮廓,并将其绘制到原始图像上。最后显示图像并等待按键关闭窗口。

1.3 怎样绘制轮廓

    cv2.drawContours()是一个用于绘制轮廓的函数,它可以根据你提供的边界点绘制任何形状。它的语法如下:

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])

参数说明:

  • image:要绘制轮廓的图像。
  • contours:轮廓列表,即cv2.findContours()函数返回的轮廓列表。
  • contourIdx:要绘制的轮廓的索引,绘制独立轮廓时很有用,-1表示绘制所有轮廓。
  • color:绘制轮廓的颜色,可以是一个BGR元组或一个整数。
  • thickness:轮廓线的粗细,默认为1。
  • lineType:轮廓线的类型,默认为cv2.LINE_8,表示8连通线。
  • hierarchy:层级关系,即cv2.findContours()函数返回的层级关系。
  • maxLevel:绘制轮廓的最大层级,默认为0,表示只绘制当前层级的轮廓。
  • offset:可选的偏移量,用于调整轮廓的位置。

cv2.drawContours()函数用于在图像上绘制轮廓。可以通过设置contourIdx参数来指定要绘制的轮廓的索引,-1表示绘制所有轮廓。可以通过设置color参数来指定绘制轮廓的颜色。绘制的轮廓线的粗细可以通过thickness参数进行设置,默认为1。轮廓线的类型可以通过lineType参数进行设置,默认为cv2.LINE_8,表示画8连通线。

以下是一个使用cv2.drawContours()函数绘制轮廓的示例代码:

import cv2# 读取图像
image = cv2.imread("image.jpg")# 灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 二值化
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)# 寻找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)# 显示图像
cv2.imshow("Contours", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,首先读取了一张图像,并对其进行了灰度化和二值化处理。然后使用cv2.findContours()函数找到图像中的轮廓,并使用cv2.drawContours()函数将轮廓绘制到原始图像上。最后显示图像并等待按键关闭窗口。

绘制独立的廓,如第四个轮廓:

img = cv2.drawContour(img, contours, -1, (0,255,0), 3)

但是大多数时候下面的方法更有用:

img = cv2.drawContours(img, contours, 3, (0,255,0), 3)

注意:最后这两种方法结果是一样的,但是后面的知识会告诉你最后一种方法更有用。

1.4 轮廓的近似方法

        上面查找轮廓的时候,提到了是函数cv2.findCountours() 有一个轮廓的近似方法参数,那么它到底代表什么意思呢?
        上面我们已经提到轮廓是一个形状具有相同灰度值的边界。它会存储形状边界上所有的(x,y)坐标。但是,需要将所有的这些边界点都存储吗?这就是这个参数要告诉函数cv2.findContours 的。
        这个参数如果被设置为cv2.CHAIN_APPROX_NONE,所有的边界点都会被存储。但是我们真的需要这么么多点吗?例如,当我们找的边界是一条直线时。你用需要把直线上所有的点来表示直线吗?不是的,我们只需要这条直线的两个端点而已。这就是cv2.CHAIN_APPROX_SIMPLE 要做的。它会将将廓上的冗余点去掉,压缩轮廓,从而节省内存开支。
        我们用下图中的矩形来演示这个技术。在轮廓列表中的每一个坐标上画一个蓝色圆圈。第一个图显示使用cv2.CHAIN_APPROX_NONE 的效果,一共734 个点。第二个图是使用cv2.CHAIN_APPROX_SIMPLE 的结果,只有4 个点。看到他的威力了吧:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/314509.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生信息管理系统 Java+SQL Server 数据库原理课程

该项目实现了图形化界面的数据库的登录,以及对数据库中表的增删查改。 正好老师布置了相关作业,通过Java 连接 SQL Server 数据库,就写一个学生管理系统。 jdk8 数据库连接通过sqljdbc6.0 图形化界面用swing 目录 1、Java 连接SQL Serv…

安装Typora

链接:https://pan.baidu.com/s/1OLHtUTziKdB0sW0UIOnBBw?pwd6666 提取码:6666

Spring04

一、AOP的概念 AOP 为 (Aspect Oriented Programming) 的缩写,意为:面向切面编程,底层是使用动态代理的技术实现对目标方法的增强和控制访问等功能。 其中AOP中有几个重要的概念: 1、通知:增强的逻辑,或者后期要加入的代码。 2、目…

Nginx 简介和入门 - part1

虽然作为1个后端程序员, 终究避不开这东西 安装Nginx 本人的测试服务器是debian , 安装过程跟ubuntu基本一样 sudo apt-get install nginx问题是 nginx 安装后 执行文件在/usr/sbin 而不是/usr/bin 所以正常下普通用户是无法使用的。 必须切换到root…

【C语言】Ubuntu 22上用GTK写GUI程序

一、GTK介绍 GTK (GIMP Toolkit) 是一个多平台的图形用户界面工具包。它最初是为图像处理程序 GIMP 开发的,后来演变成为许多操作系统上开发图形界面应用程序的通用库。GTK 是用C语言编写的,并且是自由和开源软件,遵循LGPL (GNU Lesser Gene…

python多环境管理工具——pyenv-win安装与使用教程

目录 pyenv-win简介 pyenv-win安装 配置环境变量 pyenv的基本命令 pyenv安装py环境 pyenv安装遇到问题 pycharm测试 pyenv-win简介 什么是pyenv-win: 是一个在windows系统上管理python版本的工具。它是pyenv的windows版本,旨在提供类似于unix/li…

BGP路由知识点

目录 1.BGP的工作原理: 2.BGP路由的一般格式: 3.三种不同的自治系统AS 4.BGP的路由选择 5.BGP的四种报文 BGP(Border Gateway Protocol)是一种用于自治系统(AS)之间的路由选择协议。它是互联网中最常用…

CorelDRAW是什么软件?coreldraw软件可以做什么?

CorelDRAW是什么软件? cdr是coreldraw graphics suite的简称,它是corel企业的平面设计软件,cdr软件是corel公司出品的矢量图形制作工具软件,主要用于矢量图及页面设计和图像编辑。这个图形工具给设计师提供了矢量动画、页面设计、…

JDBC->SpringJDBC->Mybatis封装JDBC

一、JDBC介绍 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我们…

全局异常和自定义异常处理

全局异常GlobalException.java,basePackages:controller层所在的包全路径 import com.guet.score_management_system.common.domian.AjaxResult; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bi…

计算机网络复习1

概论 文章目录 概论计算机网络的组成功能分类性能指标(搞清楚每个时延的具体定义)分层结构协议、接口和服务服务的分类ISO/OSITCP/IP两者的不同 计算机网络的组成 组成部分:硬件,软件和协议(协议:传输数据…

基于Flutter构建小型新闻App

目录 1. 概述 1.1 功能概述 1.2 技术准备 1.3 源码地址 2. App首页 2.1 pubspec依赖 2.2 热门首页组件 2.2.1 DefaultTabController 2.2.2 Swiper 2.3 新闻API数据访问 2.4 热门首页效果图 3. 新闻分类 3.1 GestureDetector 3.2 新闻分类效果图 4. 收藏功能 4…