OpenCV-35 查找轮廓

news2024/11/16 6:22:34

一、 什么是图像轮廓

图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检测识别中很有用。

  • 用于图形分析
  • 物体的识别和检测

注意点:

  • 为了检测的准确性,需要先对图像进行二值化或Canny操作。
  • 画轮廓时会修改输入的图像,如果之后想继续使用原始图像,应该将原始图像储存到其他变量中。(即画轮廓是在原图上进行修改

二、 查找轮廓

通过使用API --- findContours(img, mode, method[, contours[, hierarchy[, offset]]]])

  • mode 查找轮廓的模式
  • 其中RETR_EXTERNAL = 0,表示只检测外围轮廓

  • RETR_LIST = 1 , 检测的轮廓不建立等级关系,即检测所有轮廓,较为常用。

  •  RETR_CCOMP = 2,每层最多两级,从小到大,从里到外。

  • RETR_TREE = 3, 按照树型存储轮廓,从小到大,从左到右 (最常用)

method :轮廓近似方法,也叫ApproximationMode

  • 其中:CHAIN_APPROX_NONE 保存所有轮廓上的点
  • CHAIN_APPROX_SIMPLE,只保存角点,比如四边形,只保留四边形的4个角,存储信息少,比较常用。

返回值 contours和hierachy是轮廓层级

其中轮廓的类型为元组(旧版本为列表)

层级的类型为np的ndarray形式

示例代码如下:

import cv2
import numpy as np
# 导入图片
img = cv2.imread("black.png")
# 变为单通道的黑白照片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化操作  ---  返回两个值:阈值和结果
ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 打印轮廓
print(type(contours))
print(type(hierarchy))
print(contours)
print(hierarchy)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

三、 绘制轮廓

通过API --- drawContours(image, contours, contourldx[, thickness[,lineTupe[, hierachy[, maxlevel[,offset]]]])

  • image:要绘制的图象
  • conyours: 轮廓点
  • contourldx:要绘制的轮廓的编号。-1表示绘制所有的轮廓
  • color:轮廓的颜色,如(0,0,255)表示红色
  • thickness:线宽,-1表示全部填充

示例代码如下:

import cv2
import numpy as np
# 导入图片
img = cv2.imread("black.png")
# 变为单通道的黑白照片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化操作  ---  返回两个值:阈值和结果
ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
img_copy = img.copy()
# 直接在img_copy上面操作
cv2.drawContours(img_copy, contours, -1, (0, 0, 255), 2)
cv2.imshow("img", np.hstack((img, img_copy)))
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

四、轮廓的面积和周长

轮廓的面积指的是每个轮廓中所有的像素点围成的区域的面积单位为像素

轮廓面积是轮廓重要的统计特征之一,通过轮廓面积的大小可以进一步分析每个轮廓隐含的信息, 例如通过轮廓面积区分物体大小识别不同的物体

在查找到轮廓之后,可能会有很多细小的轮廓,我们可以通过轮廓的面积进行过滤。

计算轮廓面积:contourArea (contour)

计算轮廓周长:arcLength (curve, closed)

  • curve : 轮廓
  • closed:判断是否为闭合的轮廓

示例代码如下:

import cv2
import numpy as np
# 导入图片
img = cv2.imread("black.png")
# 变为单通道的黑白照片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 二值化操作  ---  返回两个值:阈值和结果
ret, new_img = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hierarchy = cv2.findContours(new_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
img_copy = img.copy()
# 直接在img_copy上面操作
cv2.drawContours(img_copy, contours, -1, (0, 0, 255), 2)
cv2.imshow("img", np.hstack((img, img_copy)))
# 计算轮廓的周长和面积
Area = cv2.contourArea(contours[0])
perimeter = cv2.arcLength(contours[1], closed=True)
print(Area)
print(perimeter)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

其中第一个为面积,第二个为周长。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fast.ai 深度学习笔记(六)

深度学习 2:第 2 部分第 12 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-12-215dfbf04a94 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,…

【EAI 016】VIMA: General Robot Manipulation with Multimodal Prompts

论文标题:VIMA: General Robot Manipulation with Multimodal Prompts 论文作者:Yunfan Jiang, Agrim Gupta, Zichen Zhang, Guanzhi Wang, Yongqiang Dou, Yanjun Chen, Li Fei-Fei, Anima Anandkumar, Yuke Zhu, Linxi Fan 作者单位:Stanfo…

什么是ROAS以及它如何衡量广告活动的有效性

有没有想过您的广告活动效果如何?想想 ROAS,即广告支出回报率。ROAS衡量的是每花一美元广告所产生的收入。虽然 ROAS 是一个强大的指标,可以为我们提供丰富的见解,但不应孤立地考虑它。本文将带你了解什么是 ROAS 以及它如何衡量广…

Qt中程序发布及常见问题

1、引言 当我们写好一个程序时通常需要发布给用户使用,那么在Qt中程序又是如何实现发布的呢,这里我就来浅谈一下qt中如何发布程序,以及发布程序时的常见问题。 2、发布过程 2.1、切换为release模式 当我们写qt程序时默认是debug模式&#x…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏17(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言制作木板UI直接复制和工具一样的即可检查背包是否有指定数量的空插槽 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇…

解决Typora导出HTML不显示图片

解决Typora导出HTML不显示图片 产生原因 Typora导出HTML不显示图片,可能时图片存放在我们的硬盘中。 我们可以将markdown中的图片转化为base64格式,嵌入到html中。 解决步骤 首先,下载 TyporaToBase64.jar 密码:45jq 其次,将…

【数据库】索引的使用

【数据库】索引的使用 前言出发示例创建表Explain 查看sql执行计划where 查询解析无索引有索引 where oderBy 查询解析无索引有索引 总结 前言 在数据库设计过程中,常需要考虑性能,好的设计可以大大提高sql 语句的增删改查速度。在表的创建过程中&…

flask+python企业产品订单管理系统938re

在设计中采用“自下而上”的思想,在创新型产品提前购模块实现了个人中心、个体管理、发布企业管理、投资企业管理、项目分类管理、产品项目管理、个体投资管理、企业投资管理、个体订单管理、企业订单管理、系统管理等的功能性进行操作。最终,对基本系统…

Linux---网络基础

计算机中的常见概念 协议(Protocol): 协议是计算机网络中用于通信的规则和约定的集合。它规定了数据传输的格式、序列、错误检测和纠正方法等。常见的网络协议包括TCP/IP、HTTP、FTP等。 IP地址(IP Address)&#xf…

Java:JDK8新特性(Stream流)、File类、递归 --黑马笔记

一、JDK8新特性(Stream流) 接下来我们学习一个全新的知识,叫做Stream流(也叫Stream API)。它是从JDK8以后才有的一个新特性,是专业用于对集合或者数组进行便捷操作的。有多方便呢?我们用一个案…

Nginx实战:1-安装搭建

目录 前言 一、yum安装 二、编译安装 1.下载安装包 2.解压 3.生成makefile文件 4.编译 5.安装执行 6.执行命令软连接 7.Nginx命令 前言 nginx的安装有两种方式: 1、yum安装:安装快速,但是无法在安装的时候带上想要的第三方包 2、…

Kafka集群安装与部署

集群规划 准备工作 安装 安装包下载:链接:https://pan.baidu.com/s/1BtSiaf1ptLKdJiA36CyxJg?pwd6666 Kafka安装与配置 1、上传并解压安装包 tar -zxvf kafka_2.12-3.3.1.tgz -C /opt/moudle/2、修改解压后的文件名称 mv kafka_2.12-3.3.1/ kafka…

华为数通方向HCIP-DataCom H12-821题库(单选题:461-480)

第461题 以下关于路由策略特点的描述,错误的是哪一项? A、能够修改路由属性,但是不能改变网络流量经过的路径 B、能通过控制路由器的路由表规模,来节约系统资源 C、能通过控制路由的接收、发布和引入,以提高网络的安全性 D、能通过修改路由属性,对网络数据流量可以合理规…

【计算机网络】进程通信

进程 process 客户和服务器进程 下载文件表示为客户 ,上载文件的对等方表示为服务器进程与计算机网络之间的接口 套接字 socket 应用层与传输层之间的接口是建立网络应用程序的可编程接口 API进程寻址 为了标识接收进程 需要两种信息 主机的地址目的主机中的接收进程…

【C++】多态语法概念

目录 一、概念及定义二、虚函数重写的特例三、final和override四、抽象类 一、概念及定义 概念:在继承关系下的不同类,调用同一个函数,产生不同的行为,叫作多态。 图示: 定义:必须通过基类的指针或者引…

fast.ai 深度学习笔记(七)

深度学习 2:第 2 部分第 14 课 原文:medium.com/hiromi_suenaga/deep-learning-2-part-2-lesson-14-e0d23c7a0add 译者:飞龙 协议:CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,…

C++对象继承

继承概念: 首先引入一个生活例子,普通人是一个类对象,学生是一个类对象,普通人拥有的属性学生一定会有,学生拥有的属性普通人不一定有。类比一下,把普通人抽象为A对象,学生抽象为B对象&#xf…

多视图特征学习 Multi-view Feature Learning既可以被看作是一种学习框架,也可以被看作是一种具体的学习算法!

Multi-view Feature Learning 1.多视图特征学习Multi-view Feature Learning的基本介绍总结 1.多视图特征学习Multi-view Feature Learning的基本介绍 多视图特征学习是一种利用多视图数据集来进行联合学习的机器学习方法。多视图数据指的是对同一事物从多种不同的途径或角度进…

Python : 使用python实现学生管理系统的功能,详细注释

一、学生管理系统 学生描述:姓名、年龄、成绩 学生管理系统功能:添加学生信息、删除学生信息、根据姓名修改学生信息、根据姓名查询学生信息、显示所有学生信息、退出系统 二、代码说明 1. 将每一个学生的信息放一个元组中,再把元组添加到列表…

LeetCode 144 二叉树的前序遍历

大家新年快乐,long年大吉 今天的题很简单,前序用栈就行。 电脑没拿,用我妈的pad艰难敲代码,敲字 知识点随便写点吧,这里基础点挺多,以后补充下 栈:先进后出,数据结构用stack&…