OpenCV-轮廓检测

文章目录

  • 一、简介
    • 1. 意义
    • 2.具体步骤
  • 二、代码实现
  • 三、总结

一、简介

1. 意义

在OpenCV中,轮廓检测是图像处理中一个非常重要的环节,它允许我们识别图像中的形状。这个过程通常涉及几个步骤:读取图像、转换为灰度图、应用阈值处理(或边缘检测)以获取二值图像、然后使用cv2.findContours()函数查找轮廓。

2.具体步骤

  • 图像预处理:首先,对原始图像进行预处理,以便更容易地检测轮廓。这通常包括转换为灰度图像、应用滤波器(如高斯模糊)以减少噪声,以及二值化图像以简化后续处理。
  • 二值化:将灰度图像转换为二值图像,即图像中的每个像素都被设置为黑色或白色,这取决于其灰度值是否超过某个阈值。二值化是轮廓检测中的关键步骤,因为它简化了图像,使得轮廓更加清晰。
  • 查找轮廓:使用OpenCV的cv2.findContours()函数在二值图像中查找轮廓。这个函数会返回图像中所有轮廓的列表以及轮廓的层次结构。
  • 轮廓绘制:为了可视化或进一步处理,可以使用cv2.drawContours()函数在原始图像或另一个图像上绘制找到的轮廓。

二、代码实现

这段代码是对图片进行轮廓检测,通过读取图片,并转换为灰度图等一系列操作来对图片进行轮廓绘制,以下是代码详情与解释。

import cv2  # 读取图像  
phone = cv2.imread('sj.png')  
# 转换为灰度图  
phone_gray = cv2.cvtColor(phone, cv2.COLOR_BGR2GRAY)  
# 显示灰度图  
cv2.imshow('phone_gray', phone_gray)  
cv2.waitKey(0)  # 应用阈值处理以进行二值化  
ret, phone_binary = cv2.threshold(phone_gray, 120, 255, cv2.THRESH_BINARY)  
# 显示二值化图像  
cv2.imshow('phone_binary', phone_binary)  
cv2.waitKey(0)  # 寻找轮廓  
contours, hierarchy = cv2.findContours(phone_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  
# 打印层次结构和轮廓数量  
print(hierarchy)  
print(len(contours))  # 轮廓绘制  
# 在原始图像上绘制轮廓  
image_copy = phone.copy()  
cv2.drawContours(image_copy, contours, -1, (0, 255, 0), 3)  
# 显示带有轮廓的图像  
cv2.imshow('Contours_show', image_copy)  
cv2.waitKey(0)  # 销毁所有窗口  
cv2.destroyAllWindows()
  • 读取图像:使用cv2.imread()函数读取名为sj.png的图像文件。
  • 转换为灰度图:通过cv2.cvtColor()函数将图像从BGR颜色空间转换为灰度图像,因为轮廓检测通常在灰度图像上进行。
  • 显示灰度图:使用cv2.imshow()函数显示灰度图像。
  • 二值化:应用阈值处理将灰度图像转换为二值图像,其中所有像素值大于或等于120的都被设置为255(白色),其余都被设置为0(黑色)。
  • 显示二值化图像:使用cv2.imshow()函数显示二值化后的图像。
  • 寻找轮廓:使用cv2.findContours()函数在二值化图像中查找轮廓。该函数返回两个值:轮廓列表和轮廓的层次结构。
  • 打印层次结构和轮廓数量:输出轮廓的层次结构和找到的轮廓数量。
  • 轮廓绘制:在原始图像(或其副本)上绘制找到的轮廓。这里使用绿色((0, 255, 0))和线宽为3来绘制。
  • 显示带有轮廓的图像:使用cv2.imshow()函数显示绘制了轮廓的图像。
  • 销毁所有窗口:在程序结束时销毁所有OpenCV创建的窗口。
    在这里插入图片描述

三、总结

在读取图像文件名,我们可以根据具体需求调整阈值处理和其他参数。此外,cv2.RETR_TREE是一个轮廓检索模式,它检索所有轮廓并创建完整的层次结构。根据我们的需求,可以选择其他检索模式,如cv2.RETR_EXTERNAL只检索最外层的轮廓。cv2.CHAIN_APPROX_SIMPLE是一个轮廓近似方法,它压缩水平、垂直和对角线段,只保留它们的端点。

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

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

相关文章

Django发送邮件

【图书介绍】《Django 5企业级Web应用开发实战(视频教学版)》_django 5企业级web应用开发实战(视频教学版)-CSDN博客 Django 5框架Web应用开发_夏天又到了的博客-CSDN博客 本文学习怎么使用Django发送邮件。 尽管使用Python的smtplib模块发送电子邮件…

Go语言概述

1.Go语言的特点 1)从语言层面支持并发,实现简单 2)goroutine,轻量级线程,可实现大并发处理,高效利用多核 3)垃圾回收机制,内存自动回收,不需要开发人员管理 4&#xff0…

2024年10款好用的图纸加密软件推荐|企业图纸的守护神

在数字化时代,图纸数据的安全性是企业不可忽视的重要任务。随着技术的不断进步,图纸加密软件成为了保护企业知识产权和敏感数据的关键工具。以下是2024年推荐的10款好用的图纸加密软件,它们各具特色,能够满足不同企业的需求。 1.…

SpringBoot大学生租房平台:技术实现与市场分析

第2章 开发环境与技术 大学生租房平台的编码实现需要搭建一定的环境和使用相应的技术,接下来的内容就是对大学生租房平台用到的技术和工具进行介绍。 2.1 MYSQL数据库 本课题所开发的应用程序在数据操作方面是不可预知的,是经常变动的,没有办…

【南京工业大学主办,JPCS出版】自动化、电气控制系统与设备

🌈2024年自动化、电气控制系统与设备国际学术会议(AECSE 2024)是致力于将“自动化与电气”领域的专家学者、研发者和技术人员汇集一堂的国际盛会。会议将于2024年10月18-20日在中国南京举行。 🌈会议的主旨是为相关领域的从业者及…

log4j日志封装说明—slf4j对于log4j的日志封装-正确获取调用堆栈

日志是项目中必用的东西,日志产品里最普及应该就是log4j了。(logback这里暂不讨论。) 先看一下常用的log4j的用法,一般来说log4j都会配合slf4j或者common-logging使用,这里已slf4j为例。添加gradle依赖: dependencies { compile(l…

zookeeper是啥?在kafka中有什么作用

一、Zookeeper是啥 问AI,它是这么说: ZooKeeper是一个开源的分布式协调服务。 ZooKeeper最初由雅虎研究院开发,用于解决大型分布式系统中的协调问题,特别是为了避免分布式单点故障。它被设计成一个简单易用的接口集,封…

Untiy TTF转换为SDF

Untiy TTF转换为SDF 原因 下载的字体是TTF格式,但是TMP使用的是SDF格式,不支持TTF,需要转换网络没有检索到TTF转SDF的教程,可能是太简单了,自己记录一下吧 Unity内转换即可 在Asset中找到自己的TTF右键点击TTF&…

团队氛围评估模型:忍耐度模型(心理调适度行为调适度)

通过“忍耐度模型”对团队氛围进行评估,可以清晰地反映出不同员工的心理状态和行为模式,进而可以采取有针对性的管理措施来优化团队氛围和提升团队绩效。 X轴:心理调适度,随坐标轴方向表示从低到高;Y轴:行…

汽车驾驶屏HMI,设计颜值相当拉风, 怪不的大家都喜欢呀。

hell,大家好,本期为大家带来汽车驾驶仪表盘的设计,尽管平时碰到设计汽车HMI的场景比较少,但是看到如此精彩和充满创意的设计,对于设计师水平提升也是十分有帮助的。

SpringBoot 集成 PDFBox 实现电子签章

Apache PDFBox 是一个开源的 Java 库,用于处理 PDF 文档。它提供了一系列强大的功能,包括创建、渲染、拆分、合并、加密、解密 PDF 文件,以及从 PDF 中提取文本和元数据等。PDFBox 支持 PDF 1.7 标准,并且兼容大多数现代 PDF 格式…

CMDB是什么软件?对企业有什么用?

配置管理数据库缩写为CMDB,英文全称为Configuration Management Database,是一种用于记录和管理企业信息技术基础设施(IT基础设施)和所有相关资源的数据库软件。 CMDB的主要功能是收集、存储和分析所有IT基础设施和服务的信息&am…

【C语言】选择排序及优化、冒泡排序、计数排序的实现

目录 一、选择排序1.1 常规版(一次排好一个数)1.1.1 基本思想1.1.2 实现思路1.1.3 代码 1.2 优化版(一次排好两个数)1.2.1 实现思路1.2.2 代码 1.3 时间复杂度 二、冒泡排序2.1 实现思路2.2 代码2.3 时间复杂度 三、计数排序3.1 基…

56页PPT | 大数据决策分析平台怎么建设?经典实践方案推荐

一、现状和目标 企业用户现状:数据分散,利用率低,业务需求变化快但IT响应慢。 问题:数据展示不及时、不准确,缺乏深入分析工具,报表制作效率低下。 目标:建设统一的数据整合平台,…

GS-SLAM论文阅读笔记--MM-Gaussian

介绍 这是一篇多模态的GS-SLAM,也已经被IROS2024录用。由于多传感器融合的GS-SLAM还是比较少的,所以应该仔细阅读一篇。 文章目录 介绍1.背景介绍2.关键内容2.1 跟踪2.2 重定位2.3 建图2.4总体流程 3.文章贡献 1.背景介绍 传统的SLAM方法往往受到地图…

Patch 35586779: WLS PATCH SET UPDATE 10.3.6.0.231017

以上补丁请自行去oracle官网下载,需要技术支持的请联系:https://item.taobao.com/item.htm?spm2013.1.w4023-17257245948.4.19611db9bzrKBx&id608692494369

软件质量保障:故障演练介绍

目录 背景:架构变化带来的问题 什么是故障演练 为什么需要故障演练 故障演练场景有哪些 不同演练类型和目标 如何对工具进行评估 功能评测项 告警评测项 观测指标评测项 总结 背景:架构变化带来的问题 随着架构越来越复杂、应用越来越多样&…

【设计模式】Template Method伪代码

1. 不好的代码 1.1 lib.cpp class Library{ public:void Step1(){//...}void Step3(){//...}void Step5(){//...} };1.2 app.cpp class Application{ public:bool Step2(){//...}void Step4(){//...} };int main() {Library lib();Application app();lib.Step1();if(app.Ste…

Python 从入门到实战12(流程控制-跳出循环语句)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…

低代码开发:业务与技术的完美融合

正文: 随着数字化转型的加速,企业对应用软件的需求日益增长。然而,传统的开发方式往往费时费力,难以满足市场的快速变化。在此背景下,低代码开发平台应运而生,它们正逐步改变我们的工作方式,让…