OpenCV如何在图像中寻找轮廓

news/2024/9/24 20:16:19/

 返回:OpenCV系列文章目录(持续更新中......)

上一篇:OpenCV如何模板匹配
下一篇 :OpenCV系列文章目录(持续更新中......)

目标

在本教程中,您将学习如何:

  • 使用 OpenCV 函数 cv::findContours
  • 使用 OpenCV 函数 cv::d rawContours

cv::findContours 和 cv::drawContours 都是 OpenCV 库中常用的图像处理函数,主要用于图像分割和轮廓绘制等操作。

cv::findContours 是一个用于在二值图像中查找轮廓的函数。它可以根据二值图像中的像素灰度值(0 或非零)来确定对象的轮廓,并返回一个由所有轮廓点构成的向量。此外,findContours 还可以实现轮廓间的层次结构分析,进一步提高轮廓分析的精度。

cv::drawContours 则可以根据给定的轮廓向量,对指定的图像进行轮廓绘制操作。它可以绘制轮廓内部、轮廓外边界、轮廓及其外边界,也可以指定边界的颜色和宽度。通过 drawContours 函数,我们可以将轮廓绘制在原图像中,以便后续的图像分析和处理。

因此,cv::findContours 和 cv::drawContours 通常会一起使用。通过 findContours 函数查找轮廓,然后利用 drawContours 函数在原图像中绘制轮廓,可以更好地实现图像分割和轮廓分析等操作。

C++代码

本教程代码如下所示。您也可以从这里下载

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>using namespace cv;
using namespace std;Mat src_gray;
int thresh = 100;
RNG rng(12345);void thresh_callback(int, void* );int main( int argc, char** argv )
{CommandLineParser parser( argc, argv, "{@input | HappyFish.jpg | input image}" );Mat src = imread( samples::findFile( parser.get<String>( "@input" ) ) );if( src.empty() ){cout << "Could not open or find the image!\n" << endl;cout << "Usage: " << argv[0] << " <Input image>" << endl;return -1;}cvtColor( src, src_gray, COLOR_BGR2GRAY );blur( src_gray, src_gray, Size(3,3) );const char* source_window = "Source";namedWindow( source_window );imshow( source_window, src );const int max_thresh = 255;createTrackbar( "Canny thresh:", source_window, &thresh, max_thresh, thresh_callback );thresh_callback( 0, 0 );waitKey();return 0;
}void thresh_callback(int, void* )
{Mat canny_output;Canny( src_gray, canny_output, thresh, thresh*2 );vector<vector<Point> > contours;vector<Vec4i> hierarchy;findContours( canny_output, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE );Mat drawing = Mat::zeros( canny_output.size(), CV_8UC3 );for( size_t i = 0; i< contours.size(); i++ ){Scalar color = Scalar( rng.uniform(0, 256), rng.uniform(0,256), rng.uniform(0,256) );drawContours( drawing, contours, (int)i, color, 2, LINE_8, hierarchy, 0 );}imshow( "Contours", drawing );
}

结果

在这里:


参考文献:

1、《Finding contours in your image》-----Ana Huamán


http://www.ppmy.cn/news/1445394.html

相关文章

【统计推断】-01 抽样原理之(三)

文章目录 一、说明二、抽样分布三 均值抽样分布3.1 有限母体无放回抽样3.2 有限母体有放回抽样3.3 无限母体 四、比例抽样分布五、和差抽样分布 一、说明 上文中叙述母体和抽样的设计&#xff1b;以及抽样分布的概念&#xff0c;本篇将这种关系定量化&#xff0c;专门针对抽样的…

稳扎稳打 部署丝滑 开源即时通讯(IM)项目OpenIM源码部署流程(linux windows mac)

背景 OpenIM包含多个关键组件&#xff0c;每个都是系统功能必不可少的一部分。具体来说&#xff0c;MongoDB 用于持久化存储&#xff1b;Redis 用作缓存&#xff1b;Kafka 用于消息队列&#xff1b;Zookeeper 用于服务发现&#xff1b;Minio 用于对象存储。这些组件的众多可能会…

ABP项目中关于Swagger显示的一些相关问题

abp默认配置如下。 public override void ConfigureServices(ServiceConfigurationContext context) {var services context.Services;services.AddAbpSwaggerGen(options >{options.SwaggerDoc("v1", new OpenApiInfo { Title "Test API", Version …

JavaScript 中的 this 到底指向谁? 今天彻底把它征服!!!

概述 我们知道&#xff0c;JS 中的 this 指向问题&#xff0c;一直是一个经久不衰的重点和考点。那么它到底难不难呢&#xff1f;怎么说呢&#xff1f;它也难也不难&#xff0c;你要是不把它理清楚&#xff0c;随意变化一下就能把你绊倒&#xff1b;但是你要是把他理清楚了以后…

社区新零售:重构邻里生活圈,赋能美好未来

新时代的邻里脉动 在城市的肌理中&#xff0c;社区作为生活的基本单元&#xff0c;正经历一场由新零售引领的深刻变革。社区新零售&#xff0c;以其独特的商业模式、创新的技术手段和以人为本的服务理念&#xff0c;重新定义了社区商业的边界&#xff0c;重构了邻里生活的形态…

vue+elementplus(五)

一级分类-整体认识和路由配置 点击上方导航栏实现跳转 router->index.js {path:category/:id,component:Category}, 来到LayoutHeader.vue 找到跳转代码 发现自己没加首页 正好一起改了 动态路由&#xff0c;跳转到分类页面下的商品数据id为路由名字 <RouterLink :…

k8s 日常维护命令简介

基础信息 1、查看客户端和服务器版本 如果 kubectl 客户端版本低于 k8s 服务端版本太多&#xff0c;使用 kubectl 管理 k8s 时可能会出现未知异常。如果升级了 k8s 版本记得也要更新下使用的 kubectl 版本。 [roothaiouc ~]# kubectl version -ojson | jq -r {client:.clien…

js逆向验证码篇之某程(滑动拼图验证码)

提示!本文章仅供学习交流,严禁用于任何商业和非法用途,未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,如有侵权,可联系本文作者删除! 前言:一开始想的是带大家直接抠混淆后的代码,但是后来想想先解混淆,然后带大家…