opencv#41 轮廓检测

轮廓概念介绍

通常我们使用二值化的图像进行轮廓检测,对轮廓以外到内进行数字命名,如下图,最外面的轮廓命名为0,向内部进行扩展,遇到黑色白色相交区域,就是一个新的轮廓,然后依次对轮廓进行编号,轮廓中可能含有新的轮廓,同时也可能含有并列轮廓,如下图中轮廓0内部包含其他子轮廓。

常用4个参数来秒数不同层级之间的结构关系,分别是:同层下一个轮廓索引同层上一个轮廓索引下一层第一个子轮廓索引上层父轮廓索引

例如轮廓0,没有同层下一个轮廓,就用-1来表示;同层上一个轮廓也没有用-1来表示;下一层第一个子轮廓索引为1,给出1;没有上层父轮廓,因此也为-1。即得到[-1,-1,1,-1]。

例如轮廓1,同层下一个轮廓索引为2;没有同层上一个轮廓,为-1;下一层第一个子轮廓索也没有,为-1;上层父轮廓索引为0;即得到[2,-1,-1,0]。这4个参数就可以描述轮廓。同样的可以得到轮廓2的参数[-1,1,3,0]。

轮廓检测

findContours()

void cv::findContours(InputArray              image,
                      OutputArrayOrArrays     contours,
                      OutputArray             hierachy,
                      Int                     mode,
                      int                     method,
                      Point                   offset = Point()
                     )

·image:输入图像,数据类型为CV_8U的单通道灰度图像或者二值化图像。

·contours:检测到的轮廓,每个轮廓中存放着像素额坐标。

·mode:轮廓检测模式标志。

·method:轮廓逼近方法标志。

·offset:每个轮廓点移动的可选偏移量。这个函数主要用在从ROI图像中找出的轮廓并基于整个图像分析轮廓的场景中。先对图像提取一个ROI区域,然后在此区域中进行轮廓检测,若想直到得到轮廓在原图像中的坐标,就需要通过此参数来配置。若是直接对整幅图像进行轮廓检测,就不需要使用最后一个参数,使用默认值即可。

检测完轮廓后,我们需要将轮廓展示出来,将所有轮廓以坐标点的形式输出,这样既不直观同时也不便于观看。

轮廓绘制

drawContours()

l

void cv::frawContours(InputArray          image,
                      InputArrayOrArrays  contours,
                      int                 contourIdx,
                      const Scalar &      corlor,
                      int                 thickness = 1, //线条粗细
                      int                 lineType = LINE_8, //绘制轮廓的线型,此处是8邻域,也可4邻域
                                          hlerarchy = 
                      InputArray          noArray(),
                      int                 maxLevel = INT_MAX,
                      Point               offset = Point()
                     )

·image:绘制轮廓的目标图像。

·contours:所有将要绘制的轮廓。

·contoursIdx:要绘制的轮廓的参数,如果是负数,则绘制所有的轮廓。

·color:绘制轮廓的颜色。

示例
#include <opencv2/opencv.hpp>
#include <iostream>
#include<vector>

using namespace cv; //opencv的命名空间
using namespace std;



//主函数
int main()
{
	system("color F0"); //更改输出界面颜色

	Mat img = imread("E:/opencv/opencv-4.6.0-vc14_vc15/opencv/snow.jpg");	
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	
	int l = 500;
	resize(img, img, Size(l, l));

	imshow("原图", img);

	Mat gray, binary;
	cvtColor(img, gray, COLOR_BGR2GRAY);//转为灰度图像
	GaussianBlur(gray, gray, Size(13, 13), 4, 4);//平滑滤波
	threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);//自适应二值化
	
	//轮廓发现与检测
	vector<vector<Point>> contours; //轮廓
	vector<Vec4i> hierarchy;//存放轮廓结构变量
	findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//绘制轮廓
	for (int i = 0; i < hierarchy.size(); i++)
	{
		cout << hierarchy[i] << endl;
	}

	int j;
	for (int j = 0 ; j < contours.size(); j++);
	{
		drawContours(img, contours, j, Scalar(0, 0, 255), 2, 8);
		imshow("轮廓检测结果", img);
		waitKey(0);
	}

	waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出

	return 0;

}
结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mac安装mysql的8.0设置面板启动不了

1、前言 记得之前安装mysql5.7的时候&#xff0c;是可以直接从设置里面的mysql面板启动的&#xff0c;但是到了mysql8.0之后就启动不了了&#xff0c;这个问题不知道是版本问题还是我换了m系列芯片的mysql导致的&#xff0c;之前很多次都启动不了&#xff0c;这次搞了下&#x…

sql注入,布尔盲注和时间盲注,无回显

布尔盲注 通过order by分组可以看到&#xff0c;如果正确会i显示you are in&#xff0c;错误则无任何提示&#xff0c;由此可以判断出&#xff0c;目前只显示对错&#xff0c;此外前端不会显示任何数据 也就是说&#xff0c;目前结果只有两种&#xff0c;在这种只有两种变量的…

三子棋游戏小课堂

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今天的主菜是&#xff0c;C语言实现的三子棋小游戏&#xff0c; 所属专栏&#xff1a; C语言知识点 主厨的主页&#xff1a;Chef‘s blog 前言&…

在ubuntu22.04中借助docker实现安装、调试ros1.0

一.安装docker 参考&#xff1a;https://www.cnblogs.com/cqpanda/p/16247919.html 使用安装方法1直接安装&#xff0c;没出问题&#xff0c;我就继续了。出问题按方法2安装吧。 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 二.docker中安装ros1.…

101.对称二叉树

101.对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; …

【C语言】epoll_wait / select

一、epoll_wait和select对比 1. 阻塞和非阻塞 在Linux C语言中进行socket编程时&#xff0c;epoll_wait 和 select 都是用于多路I/O复用的系统调用&#xff0c;但是它们的行为可以设置为阻塞和非阻塞模式&#xff0c;这取决于调用它们时所使用的参数。 让我们分别看看 epoll…

[网络安全] IIS----WEB服务器

一、 WEB服务器 WEB服务器 也叫网页服务器和 HTTP服务器使用协议: HTTP(端口:80) 或 HTTPS(端口443)浏览器:HTTP客户端网站: 一个或多个网页组成的集合 二、HTTP和HTTPS协议: HTTP : 是 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;的简写&#xff0c;…

Maven安装,学习笔记,详细整理maven的一些配置

Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后&#xff0c;我们即将开始学习后端Web开发技术。做为一名Java开发工程师&#xff0c;后端 Web开发技术…

Solon 开源框架讲的“三源合一”是怎么回事?

1、什么是“三源合一”&#xff1f; “三源合一”&#xff0c;是 Solon 应用开发框架早期的一个架构想法。是指 Http、Socket、WebSocket 几个不同的通讯信号&#xff0c;进行统一架构处理…并且小巧。 对于 Socket 和 WebSocket&#xff0c;在原 消息监听 的模式之外增加了 M…

Wireshark网络协议分析 - Wireshark速览

在我的博客阅读本文 文章目录 1. 版本与平台2. 快速上手2.1. 选择网络接口进行捕获&#xff08;Capture&#xff09;2.2. 以Ping命令为例进行抓包分析2.3. 设置合适的过滤表达式2.4. 数据包详情2.5. TCP/IP 四层模型 3. 参考资料 1. 版本与平台 Wireshark是一个开源的网络数据…

vue——实现多行粘贴到table事件——技能提升

最近在写后台管理系统时&#xff0c;遇到一个需求&#xff0c;就是要从excel表格中复制多行内容&#xff0c;然后粘贴到后台系统中的table表格中。 如下图所示&#xff1a;一次性复制三行内容&#xff0c;光标放在红框中的第一个框中&#xff0c;然后按ctrlv粘贴事件&#xff0…

机器学习复习(6)——numpy的数学操作

加减法运算 # 创建两个不同的数组 a np.arange(4) #list(0,1,2,3 b np.array([5,10,15,20]) # 两个数组做减法运算 b-a 运行结果&#xff1a; 计算数组的平方 #b*2代表数组b每个元素乘以2 #b**2代表数组b每个元素的2次方 b**2 运行结果&#xff1a; 计算数组的正弦值 #…

简单高效 Learn LaTeX 013 - LaTex FloatingBody Tables (44 mins) 浮动体表格

浮动体是LaTex中的一个重要概念&#xff0c;这个视频演示了以浮动体为载体的表格的排版应用。 https://www.douyin.com/user/self?modal_id7305874487138913574&showTabpost

机器学习的精髓-梯度下降算法

目 1. 梯度下降算法2. 梯度下降求解3. 总结 1. 梯度下降算法 梯度下降算法是一种优化算法&#xff0c;用于最小化函数的数值方法。它通过沿着函数梯度的反方向来更新参数&#xff0c;以逐步减小函数值。这一过程重复进行直到达到收敛条件。梯度下降算法有多种变体&#xff0c;…

02、全文检索 ------ Solr(企业级的开源的搜索引擎) 的下载、安装、Solr的Web图形界面介绍

目录 Solr 的下载和安装Solr的优势&#xff1a;Lucene与Solr 安装 Solr1、下载解压2、添加环境变量3、启动 Solr Solr 所支持的子命令&#xff1a;Solr 的 Core 和 Collection 介绍Solr 的Web控制台DashBoard&#xff08;仪表盘&#xff09;Logging&#xff08;日志&#xff09…

vscode 插件 Tailwind CSS IntelliSense 解决 class 提示问题

问题描述&#xff1a; 如下写js字符串是没有class智能提示的&#xff1a; const clsName bg-[#123456] text-[#654321] return <div className{clsName}></div>解决方案&#xff1a; 安装 clsx 依赖 pnpm i clsx设置 vscode 的 settings.json {"tailwin…

150基于matlab的凸轮轮廓的设计计算与绘图计算此结构的最优化参数

基于matlab的凸轮轮廓的设计计算与绘图计算此结构的最优化参数&#xff0c;根据其原理输出推程和回程的最大压力角、最小曲率半径等相关结果。程序已调通&#xff0c;可直接运行。 150 凸轮轮廓的设计 结构的最优化参数 (xiaohongshu.com)

外星人入侵(python)

前言 代码来源《python编程从入门到实践》Eric Matthes 署 袁国忠 译 使用软件&#xff1a;PyCharm Community Editor 2022 目的&#xff1a;记录一下按照书上敲的代码 alien_invasion.py 游戏的一些初始化设置&#xff0c;界面的大小&#xff0c;标题 import sys import …

spring boot 项目中的异常处理

出现异常&#xff1a; 怎样定义全局异常处理器 新建一个类&#xff0c;加上注释两个 ControllerAdvice(basePackages"com.example.controller") public class GlobalExceptionHandler {private static final Log log LogFactory.get();//统一异常处理ExceptionHandl…

SOLIDWORKS Simulation 2024增强新功能

SOLIDWORKS 2024 新功能前瞻| SOLIDWORKS Simulation 功能增强 • 性能增强功能 • 壳体的接合交互 • 网格性能 • 欠约束实体检测 • 增强型轴承接头 • 收敛检查图解 • 去耦合混合自由体模式 • 复制算例时排除网格和结果 • 新增在网格化后及分析完成后自动保存模…