当前位置: 首页 > news >正文

OpenCV结构分析与形状描述符(10)检测并提取轮廓函数findContours()的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

在二值图像中查找轮廓。

该函数使用算法 253从二值图像中检索轮廓。轮廓是有用的工具,可用于形状分析和对象检测与识别。参见 OpenCV 示例目录中的 squares.cpp。

findContours 是 OpenCV 库中的一个重要函数,用于从二值图像中检测并提取轮廓。轮廓是指图像中具有连续边界像素的集合,通常用于描述图像中的对象边界。findContours 函数可以从二值图像中找到所有连通的非零像素组成的轮廓,并返回一组轮廓点。

函数原型1


void cv::findContours	
(InputArray 	image,OutputArrayOfArrays 	contours,OutputArray 	hierarchy,int 	mode,int 	method,Point 	offset = Point() 
)		

参数1

  • 参数image Source, 源图像,一个8位单通道图像。非零像素被视为1。零像素保持为0,因此图像被视为二值图像。你可以使用 compare、inRange、threshold、adaptiveThreshold、Canny 等方法将灰度图像或彩色图像转换为二值图像。如果模式等于 RETR_CCOMP 或 RETR_FLOODFILL,输入也可以是一个32位整数标签图像(CV_32SC1)。

  • 参数contours 检测到的轮廓。每个轮廓存储为一个点的向量(例如 std::vector<std::vectorcv::Point>)。

  • 参数hierarchy 可选的输出向量(例如 std::vectorcv::Vec4i),包含有关图像拓扑结构的信息。它有与轮廓数量相同数量的元素。对于每个第 i 个轮廓 contours[i],元素 hierarchy[i][0]、hierarchy[i][1]、hierarchy[i][2] 和 hierarchy[i][3] 分别设置为在同一层次级别下的下一个轮廓和前一个轮廓在 contours 中的0基础索引,第一个子轮廓和父轮廓。如果对于轮廓 i 没有下一个轮廓、前一个轮廓、父轮廓或嵌套轮廓,hierarchy[i] 的相应元素将是负数。

  • 参数mode 轮廓检索模式,参考RetrievalModes

  • 参数method 轮廓近似方法,参考ContourApproximationModes。

  • 参数offset 可选偏移量,用于移动轮廓上的每一个点。这对于从图像的感兴趣区域(ROI)中提取轮廓并在整个图像上下文中分析这些轮廓时非常有用。

函数原型2

这是一个重载成员函数,为方便提供。它与上述函数的不同之处仅在于它接受的参数


void cv::findContours	
(InputArray 	image,OutputArrayOfArrays 	contours,int 	mode,int 	method,Point 	offset = Point() 
)		

代码示例


#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main()
{// 读取图像Mat img = imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", IMREAD_GRAYSCALE );if ( img.empty() ){cerr << "Error: Image not found." << endl;return -1;}// 定义一个感兴趣区域Rect roi( 260, 450, 250, 250 );Mat imgROI = img( roi );// 二值化处理Mat binImg;threshold( imgROI, binImg, 200,255, THRESH_BINARY_INV );//imshow( "binary Image", binImg );// 找到轮廓vector< vector< Point > > contours;vector< Vec4i > hierarchy;findContours( binImg, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point( roi.x, roi.y ) );  // 应用偏移量// 在原图上绘制轮廓Mat drawing = Mat::zeros( img.size(), CV_8UC3 );for ( size_t i = 0; i < contours.size(); i++ ){Scalar color = Scalar( 0, 255, 0 );  // 绿色drawContours( drawing, contours, i, color, 2, LINE_8, hierarchy, 0, Point() );}// 显示结果imshow( "Original Image", img );imshow( "Contours with Offset", drawing );waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

相关文章:

OpenCV结构分析与形状描述符(10)检测并提取轮廓函数findContours()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在二值图像中查找轮廓。 该函数使用算法 253从二值图像中检索轮廓。轮廓是有用的工具&#xff0c;可用于形状分析和对象检测与识别。参见 OpenC…...

HBase 源码阅读(二)

衔接 在上一篇文章中&#xff0c;HMasterCommandLine类中在startMaster();方法中 // 这里除了启动HMaster之外&#xff0c;还启动一个HRegionServerLocalHBaseCluster cluster new LocalHBaseCluster(conf, mastersCount, regionServersCount,LocalHMaster.class, HRegionSer…...

深度学习每周学习总结N9:transformer复现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 多头注意力机制前馈传播位置编码编码层解码层Transformer模型构建使用示例 本文为TR3学习打卡&#xff0c;为了保证记录顺序我这里写…...

数据结构与算法(3)栈和队列

1.前言 哈喽大家好啊&#xff0c;今天博主继续为大家带来数据结构与算法的学习笔记&#xff0c;今天是关于栈和队列&#xff0c;未来博主会将上一章《顺序表与链表》以及本章《栈与队列》做专门的习题应用专题讲解&#xff0c;都会很有内容含量 &#xff0c;欢迎大家多多支持&…...

11、Django Admin启用对计算字段的过滤

重新定义admin.py中的Hero管理模型如下&#xff1a; admin.register(Hero) class HeroAdmin(admin.ModelAdmin):list_display ("name", "is_immortal", "category", "origin", "is_very_benevolent")list_filter ("…...

xxl-job升级到springboot3.0 导致页面打不开报错)问题

原因&#xff1a;springboot3.0 因为移除了jsp 导致xxl-job不能访问&#xff0c;解决方法如下 1、修改PermissionInterceptor拦截器 package com.xxl.job.admin.controller.interceptor;import com.xxl.job.admin.controller.annotation.PermissionLimit; import com.xxl.job.…...

栈和队列.

目录 1. 栈&#xff08;Stack&#xff09; 2. 栈的模拟实现 3. 栈的应用场景 4. 队列&#xff08;Queue&#xff09; 5. 队列的模拟实现 6. 循环队列 7. 双端队列&#xff08;Deque&#xff09; 8. 面试题 1. 栈&#xff08;Stack&#xff09; 栈&#xff1a;一种特殊…...

Parallel.ForEach - 并行处理

Parallel.ForEach 是 C# 中 System.Threading.Tasks.Parallel 类提供的一个方法&#xff0c;用于并行地迭代集合中的每一个元素。Parallel.ForEach 方法允许多个线程同时处理集合中的元素&#xff0c;从而提高程序的执行效率&#xff0c;特别是在处理大量数据或执行耗时任务时。…...

【MySQL】初识MySQL—MySQL是啥,以及如何简单操作???

前言&#xff1a; &#x1f31f;&#x1f31f;本期讲解关于MySQL的简单使用和注意事项&#xff0c;希望能帮到屏幕前的你。 &#x1f308;上期博客在这里&#xff1a;http://t.csdnimg.cn/wwaqe &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 目…...

LLM应用实战: 产业治理多标签分类

数据介绍 标签体系 产业治理方面的标签体系共计200个&#xff0c;每个标签共有4个层级&#xff0c;且第3、4层级有标签含义的概括信息。 原始数据 企业官网介绍数据&#xff0c;包括基本介绍、主要产品等 企业专利数据&#xff0c;包括专利名称和专利摘要信息&#xff0c;且专…...

下载Mongodb 4.2.25 版本教程

1、MongoDB 安装包的下载链接 Download MongoDB Community Server | MongoDB 进入如下截图&#xff1a; 2、查找历史版本 往下拉&#xff0c;点击“...”,找到”Archived releases”,点击进入 、 3、下载Mongodb 4.2.25 版本 找到如下图4.2.25版本下载链接&#xff0c;点击就可…...

docker拉取redis5.0.5并建立redis集群

1.配置文件 mkdir -p redis-cluster/7001/ mkdir -p redis-cluster/7002/ mkdir -p redis-cluster/7003/ mkdir -p redis-cluster/7004/ mkdir -p redis-cluster/7005/ mkdir -p redis-cluster/7006/cd redis-clustervim 7001/redis.confbind 0.0.0.0port 7001cluster-enabled…...

React16新手教程记录

文章目录 前言一些前端面试题1. 搭建项目1. 1 cdn1. 2 脚手架 2. 基础用法2.1 表达式和js语句区别&#xff1a;2.2 jsx2.3 循环map2.4 函数式组件2.5 类式组件2.6 类组件点击事件2.6.1 事件回调函数this指向2.6.2 this解决方案2.6.2.1 通过bind2.6.2.2 箭头函数&#xff08;推荐…...

怎么摆脱非自然链接?

什么是非自然链接&#xff1f; 非自然链接是人为创建的链接&#xff0c;用于操纵网站在搜索引擎中的排名。非自然链接违反了Google 的准则&#xff0c;网站可能会因此受到惩罚。 它们不是由网站所有者编辑放置或担保的。示例包括带有过度优化锚文本的链接、通过 PR 的广告、嵌…...

【2024数模国赛赛题思路公开】国赛B题第二套思路丨附可运行代码丨无偿自提

2024年数模国赛B题解题思路 B 题 生产过程中的决策问题 一、问题1解析 问题1的任务是为企业设计一个合理的抽样检测方案&#xff0c;基于少量样本推断整批零配件的次品率&#xff0c;帮助企业决定是否接收供应商提供的这批零配件。具体来说&#xff0c;企业需要依据两个不同…...

P1166 打保龄球

共可以投 1 局 一局10轮 在一局中&#xff0c;一共有十个柱&#xff0c;会出现很多种情况。 第1次把10个 打倒全部 >> 分数10后2次得分 --若是第10轮则还需另加两次滚球&#xff1b; 没全部打倒 >> 第2次把剩下的 打倒 >&g…...

[数据集][目标检测]西红柿成熟度检测数据集VOC+YOLO格式3241张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3241 标注数量(xml文件个数)&#xff1a;3241 标注数量(txt文件个数)&#xff1a;3241 标注…...

数仓工具—Hive语法之URL 函数

hive—语法—URL 函数 业务需求中,我们经常需要对用户的访问、用户的来源进行分析,用于支持运营和决策。例如我们经常对用户访问的页面进行统计分析,分析热门受访页面的Top10,观察大部分用户最喜欢的访问最多的页面等: 又或者我们需要分析不同搜索平台的用户来源分析,统…...

c#如何实现触发另外一个文本框的回车事件

一.需求 我需要实现listview中的一行双击后&#xff0c;将其中的一个值传给一个文本框&#xff0c;传完后&#xff0c;给文本框一个回车指令。 我的方法&#xff1a;后面加上 \rthis.txt_ID.Text this.listView1.SelectedItems[0].Text"\r" 结果无效。 二.问通义…...

Vue 中 nextTick 的最主要作用是什么,为什么要有这个 API

在 Vue.js 中&#xff0c;nextTick 是一个用于在 DOM 更新后执行代码的 API。它的主要作用是确保在某个操作完成后&#xff0c;DOM 已经更新且可以被访问或操作。这个 API 在处理需要等待 DOM 更新完成的逻辑时非常有用。 nextTick 的最主要作用 确保 DOM 更新完成: Vue 的响应…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...