OpenCV 入门教程:寻找和绘制轮廓

OpenCV 入门教程:寻找和绘制轮廓

  • 导语
  • 一、寻找轮廓
  • 二、绘制轮廓
  • 三、示例应用
    • 3.1 目标检测和定位
    • 3.2 图像分割
  • 总结

导语

寻找和绘制轮廓是图像处理中常用的技术之一,用于识别、定位和分析图像中的目标区域。在 OpenCV 中,寻找和绘制轮廓可以通过边缘检测和形态学操作实现。本文将以寻找和绘制轮廓为中心,为你介绍使用 OpenCV 进行轮廓处理的基本步骤和实例。

😃😄 ❤️ ❤️ ❤️

一、寻找轮廓

寻找轮廓是通过边缘检测和形态学操作,将图像中的目标区域边界提取出来。以下是一个使用寻找轮廓的示例代码:

import cv2# 读取图像文件
image = cv2.imread('image.jpg')# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行边缘检测
edges = cv2.Canny(gray_image, 100, 200)# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

在上述示例中,我们首先将彩色图像转换为灰度图像,然后使用 Canny 函数进行边缘检测。接下来,使用 findContours 函数寻找图像中的轮廓。 RETR_EXTERNAL 参数表示只检测外部轮廓, CHAIN_APPROX_SIMPLE 参数表示简化轮廓的表示方式。

二、绘制轮廓

绘制轮廓是通过将寻找到的轮廓绘制在图像上,用于可视化和分析。以下是一个使用绘制轮廓的示例代码:

import cv2# 读取图像文件
image = cv2.imread('image.jpg')# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行边缘检测
edges = cv2.Canny(gray_image, 100, 200)# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)

在上述示例中,我们在原始图像上使用 drawContours 函数绘制寻找到的轮廓。 contours 参数是轮廓列表, -1 参数表示绘制所有轮廓, (0, 255, 0) 参数表示绘制轮廓的颜色, 2 参数表示绘制轮廓的线宽。

三、示例应用

现在,我们来看一些常见的示例应用,演示寻找和绘制轮廓的操作:

3.1 目标检测和定位

使用寻找和绘制轮廓可以实现目标检测和定位。以下是一个示例代码:

import cv2# 读取图像文件
image = cv2.imread('image.jpg')# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行边缘检测
edges = cv2.Canny(gray_image, 100, 200)# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)

这个示例将加载名为" image.jpg "的图像文件,并通过边缘检测和轮廓绘制实现目标检测和定位。

展示:
在这里插入图片描述

3.2 图像分割

寻找和绘制轮廓还可以用于图像分割,将图像中的目标区域提取出来。以下是一个示例代码:

import cv2# 读取图像文件
image = cv2.imread('image.jpg')# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行边缘检测
edges = cv2.Canny(gray_image, 100, 200)# 寻找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 2)# 提取目标区域
segmented_image = cv2.bitwise_and(image, image, mask=edges)

这个示例将加载名为" image.jpg "的图像文件,并通过边缘检测和轮廓绘制提取出目标区域。

展示:
在这里插入图片描述

总结

通过本文的介绍,你已经了解了使用 OpenCV 进行寻找和绘制轮廓的基本步骤。你学会了使用边缘检测和 findContours 函数寻找图像中的轮廓,并使用 drawContours 函数绘制轮廓。

寻找和绘制轮廓是图像处理中常用的技术,可以用于目标检测、定位、图像分割等多个领域。通过调整边缘检测和轮廓绘制的参数,你可以根据实际需求得到所需的轮廓处理效果。

祝你在使用 OpenCV 进行寻找和绘制轮廓的过程中取得成功!

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

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

相关文章

MySQL数据库 - 表的操作

目录 一、创建表 二、创建表案例 1、显示当前使用的数据库名 2、创建表 2.1 MyISAM存储引擎表 2.2 InnoDB存储引擎表 三、查看表结构 四、修改表 1、新增列 2、修改列类型 3、修改列名 4、修改表名 5、删除列 五、删除表 表的操作至少会涉及如下两类SQL语句&…

Linux--调试器:gdb

gcc与g默认动态链接形成的可执行程序(比如a.out)是release 版本,不可调试!!! 如何搞成debug可调试版本? gcc 程序名 -o 可执行程序名 -g //添加了-g就表明该程序是debug方式发布的 查看可执行…

【Python】面向对象 - 封装 ② ( 访问私有成员 | 对象无法访问私有变量 / 方法 | 类内部访问私有成员 )

文章目录 一、访问私有成员1、对象无法访问私有变量2、对象无法访问私有方法3、类内部访问私有成员 一、访问私有成员 1、对象无法访问私有变量 在下面的 Python 类 Student 中 , 定义了私有的成员变量 , # 定义私有成员__address None该私有成员变量 , 只能在类内部进行访问 …

depot_tools问题记录 - 执行fetch/gclient命令无响应

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 在研究将Dart dill文件序列化为可读文本时遇到的问题。 开发环境 macOS: 13.4 问题描述 之前使用depot_tools中的fetch/gclient命令还是正常的,今天想实测--no-history参数时突然遇到命令无响应的情况…

在 FPGA 上通过 2D CNN 进行高效视频理解的 TSM 网络

在这个项目中,将在线和离线 TSM 网络部署到 FPGA,通过 2D CNN 执行视频理解任务。 介绍 在这个项目中,展示了 Temporal-Shift-Module ( https://hanlab.mit.edu/projects/tsm/)在 FPGA 上解决视频理解问题的实用性和性能。 TSM 是一种网络结构…

Docker快速部署Hadoop环境

Docker安装部署Hadoop环境,通过三个容器来模拟三个节点,最后只保留Master节点实现搭建。 安装环境 Ubuntu 22.04.1 LTS 和Docker 23.0.1 安装过程 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/hadoop_test/hadoop_base在Docker中创建网…

十三、Docker Compose使用和主要功能

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 一、核心概念二、主要功能二、docker compose常用命令三、docker compose 案例3.1 自己写一个微服务模块3.2 用Dockerfile将上面的模块编排(不使用compose)3.3 使用compose编…

Go语言-数组和切片有什么异同?

slice 的底层数据是数组,slice 是对数组的封装,它描述一个数组的片段。两者都可以通过下标来访问单个元素。 数组是定长的,长度定义好之后,不能再更改。在 Go 中,数组是不常见的,因为其长度是类型的一部分…

【开源软件治理】MITRE : 开源软件

定义: 开源软件(OSS)是一种商业软件,只需同意遵守附带的 OSS 许可证即可获得全部所有权,无需立即进行第三方验证。同意 OSS 许可证允许个人、公司或政府实体根据需要尽可能频繁和广泛地复制、分发和运行 OSS 应用程序&…

现代C++新特性 扩展的聚合类型(C++17 C++20)(PC浏览效果更佳)

文字版PDF文档链接:现代C新特性(文字版)-C文档类资源-CSDN下载 1.聚合类型的新定义 C17标准对聚合类型的定义做出了大幅修改,即从基类公开且非虚继承的类也可能是一个聚合。同时聚合类型还需要满足常规条件。 1.没有用户提供的构造函数。…

Django_模型类详解(七)

目录 一、定义属性 字段类型 选项 二、查询集 两大特性 查询集的缓存 限制查询集 三、条件查询 条件运算符 1) 查询相等 2) 模糊查询 3) 空查询 4) 范围查询 5) 比较查询 6) 日期查询 F对象 Q对象 聚合函数 四、关联查询 通过对象执行关联查询 通过模型类执…

Squid 缓存代理(一)---原理及搭建(传统代理、透明代理)

前言 Squid 是 Linux 系 统 中 最 常 用 的 一 款 开 源 代 理 服 务 软 件 ( 官 方 网 站 为 http://www.squid-cache.org),可以很好地实现 HTTP 和 FTP,以及 DNS 查询、SSL 等应用的缓存代理。缓存代理作为应用层的代理服务软件…