OpenCV如何在图像中寻找轮廓

server/2024/10/18 18:14:30/

 返回: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/server/24577.html

相关文章

Springboot+Vue项目-基于Java+MySQL的校园疫情防控系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

上门服务系统|上门服务小程序搭建流程

随着科技的不断进步和人们生活水平的提高&#xff0c;越来越多的服务开始向线上转型。传统的上门服务业也不例外&#xff0c;随着上门服务小程序的兴起&#xff0c;人们的生活变得更加便捷和高效。本文将为大家介绍上门服务小程序的搭建流程以及应用范围。 一、上门服务小程序搭…

数据库学习之常见的一些SQL命令

查看当前DBMS下所有数据库 show databases; 切换到某一个数据库 use 数据库名; 开启root的远程登录 update mysql.user set host"%" where user"root"; 刷新权限列表 flush privileges; 创建数据库 create database 数据库名称 删除数据库 drop…

vs2022 设置远程调试虚拟机Ubuntu程序 (cmake)

一 . 先将虚拟机设置为桥接模式 双击进入&#xff0c;勾选物理模式 点确定&#xff0c;然后重启虚拟机 二 . 打开ubuntu的ssh模式 使允许远程 altcontrol T 打开终端 sudo apt-get update sudo apt-get install openssh-server sudo systemctl start ssh sudo systemctl…

消息队列 RabbitMQ python实战

目录 RabbitMQ使用完整代码 Rabbitmq报错pika.exceptions.IncompatibleProtocolError StreamLostError (‘Transport indicated EOF‘,) 我的解决方法: 安装: pip install pika RabbitMQ使用完整代码 import asyncio import json import os import queue import time…

linux通过使用bash脚本同时运行多个命令

1、使用&&或||或;&#xff08;根据需要选择连接符号&#xff09;等来连接多条命令 && -> "与"&#xff0c;一条命令执行出错&#xff0c;则后面命令不执行 || -> "或"&#xff0c;一条命令执行成功&#x…

陶粒砂加气砌块中墙建材宝山奉贤崇明吴江姑苏虎丘aac加气砌块松江青浦吴中相城轻质砖苏州黄浦杨浦加气块闵行嘉定金山

陶粒砂加气砌块中墙建材宝山奉贤崇明吴江姑苏虎丘aac加气砌块松江青浦吴中相城轻质砖苏州黄浦杨浦加气块闵行嘉定金山 陶粒砂加气砌块是一种轻质、多孔的建筑材料&#xff0c;通常由水泥、细骨料&#xff08;如陶砂&#xff09;、粗骨料&#xff08;如陶粒&#xff09;、发泡剂…

20 | 幻读是什么,幻读有什么问题?

幻读是什么&#xff1f; 在可重复读隔离级别下&#xff0c;普通的查询是快照读&#xff0c;是不会看到别的事务插入的数据的。因此&#xff0c;幻读在“当前读”下才会出现。上面 session B 的修改结果&#xff0c;被 session A 之后的 select语句用“当前读”看到&#xff0c;…