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;}
结果

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

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

相关文章

Django模型(九)

一、使用SQL语句 1.1、通过模型使用SQL 通过raw函数执行原始SQL语句进行查询,主键字段必须包含在查询的字段中,不然会引发错误 : # 定义个 Cook 模型 class Cook(models.Model):"""厨师"""name = models.CharField(max_length=32,verbose_n…

【每日一题】 2024年1月汇编

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 【1.4】2397.被列覆盖的最多行数 2397. 被列覆盖的最多行数https://leetcode.cn/problems/maximum-rows-covered-by-columns/ 这…

AirSim+UE+rviz+ros话题运行顺序

一.步骤一 先点击 UE 的运行按钮&#xff0c;看到准备运行的无人机 打开一个新终端&#xff0c;在 ~/AirSim/ros 路径下&#xff0c;输入 source devel/setup.bash roslaunch airsim_ros_pkgs airsim_node.launch二.步骤二 1.查看话题数据 再打开一个新终端&#xff0c;输入…

摄影分享|基于Springboot的摄影分享网站设计与实现(源码+数据库+文档)

摄影分享网站目录 目录 基于Springboot的摄影分享网站设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、图片素材管理 3、视频素材管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐…

微软Azure-OpenAI 测试调用及说明

本文是公司在调研如何集成Azure-openAI时&#xff0c;调试测试用例得出的原文&#xff0c;原文主要基于官方说明文档简要整理实现 本文已假定阅读者申请部署了模型&#xff0c;已获取到所需的密钥和终结点 变量名称值ENDPOINT从 Azure 门户检查资源时&#xff0c;可在“密钥和…

开阳630hv100的代码编译以及软件制作步骤

打开项目功能步骤&#xff1a; 编译awtk功能&#xff1a; 选中awtk工程&#xff0c;先编译一次awtk sdk&#xff08;如下图的3和4步骤&#xff09;&#xff1b; 编译项目代码&#xff08;如下图步骤5和6&#xff09;&#xff1b; 编译完成后&#xff0c;软件路径&#xff1a;…

【Java程序设计】【C00181】基于SSM的流浪动物收养管理系统(论文+PPT)

基于SSM的流浪动物收养管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的流浪动物收养管理系统 本系统分为前台系统、后台管理员以及后台用户3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xf…

WebAssembly核心编程[1]:wasm模块实例化的N种方式

当我们在一个Web应用中使用WebAssembly&#xff0c;最终的目的要么是执行wasm模块的入口程序&#xff08;通过start指令指定的函数&#xff09;&#xff0c;要么是调用其导出的函数&#xff0c;这一切的前提需要创建一个通过WebAssembly.Instance对象表示的wasm模块实例(源代码…

字段使用函数是否会走索引

之前的印象中&#xff0c;字段上使用了函数操作&#xff0c;查询不会走索引。 一&#xff0c;AI回答 回答1 回答2 回答3 二&#xff0c;测试样例 查询未来n天内所有数据 查询方式1 EXPLAIN SELECT * FROM vehicle_info WHERE annual_inspection_due_date BE…

护眼大路灯到底怎么选?盘点2024年口碑好的大路灯

作为两个孩子的老母亲&#xff0c;我深刻明白光线对孩子视力的影响&#xff01;孩子经常长时间学习眼睛酸痛疲劳已是家常便饭&#xff0c;家里还有一个工作辛苦的设计师老父亲&#xff0c;平时也少不了加班加点的赶稿&#xff0c;真的很需要一个全家都能用的照明神器&#xff0…

spdk技术原理简介和实践经验

一、导读 与机械硬盘相比&#xff0c;NVMe-ssd在性能、功耗和密度上都有巨大的优势&#xff0c;并且随着固态存储介质的高速发展&#xff0c;其价格也在大幅下降&#xff0c;这些优势使得NVMe-ssd在分布式存储中使用越来越广泛。由于NVMe-ssd的性能比传统磁盘介质高出很多&…

谷粒商城【成神路】-【3】——三级分类

目录 &#x1f37f;1.查询三级分类 &#x1f9c2;2.前端页面搭建 &#x1f35f;3.添加网关 &#x1f373;4.解决跨域 &#x1f9c7;5.显示分类 &#x1f95e;6.显示复选框 1.查询三级分类 1.controller 直接调用service层的接口 RequestMapping("/list/tree&qu…