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

OpenCV 图形API(64)图像结构分析和形状描述符------在图像中查找轮廓函数findContours()

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

算法描述

在二值图像中查找轮廓。
该函数使用[253]中的算法从二值图像检索轮廓。轮廓是形状分析以及对象检测和识别的有用工具。请参阅 OpenCV 示例目录中的 squares.cpp。

注意
函数文本ID为 “org.opencv.imgproc.shape.findContours”。

函数原型

GArray<GArray<Point> > cv::gapi::findContours 
(const GMat &  	src,const RetrievalModes  	mode,const ContourApproximationModes  	method,const GOpaque< Point > &  	offset 
) 	

参数

  • 参数 src:输入灰度图像 CV_8UC1。非零像素被视为 1。零像素保持为 0,因此图像被视为二值图像。您可以使用 compare、inRange、threshold、adaptiveThreshold、Canny 等方法从灰度或彩色图像创建二值图像。如果 mode 等于 RETR_CCOMP,则输入也可以是标签的 32 位整数图像 (CV_32SC1)。如果 mode 是 RETR_FLOODFILL,则仅支持 CV_32SC1。
  • 参数 mode:轮廓检索模式,参见 RetrievalModes。
  • 参数 method:轮廓近似方法,参见 ContourApproximationModes。
  • 参数 offset:可选偏移量,每个轮廓点都会根据此偏移量进行移动。当轮廓是从图像 ROI 中提取并需要在整个图像上下文中进行分析时,这非常有用。

返回值

检测到的轮廓的 GArray。每个轮廓都存储为点的 GArray。

代码示例

#include <opencv2/gapi.hpp>
#include <opencv2/gapi/core.hpp>
#include <opencv2/gapi/imgproc.hpp>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace cv::gapi;int main() {// 读取输入图像,这里假设为灰度图像Mat src = imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", IMREAD_GRAYSCALE);if (src.empty()) {std::cerr << "无法读取图像" << std::endl;return -1;}// 转换为二值图像Mat binary;threshold(src, binary, 127, 255, THRESH_BINARY);// 创建一个彩色版的输入图像,以便绘制彩色边框Mat src_color;cvtColor(src, src_color, COLOR_GRAY2BGR);// 定义G-API网络GMat in;auto contours_op = gapi::findContours(in, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 移除偏移点参数GComputation comp(GIn(in), GOut(contours_op));// 使用G-API获取轮廓std::vector<std::vector<Point>> contours_host; // Host storage for contours// Apply the computation to get contourscomp.apply(cv::gin(binary), cv::gout(contours_host)); // 使用gin和gout宏来包装输入和输出// 对于每个轮廓,计算并绘制边界矩形for (const auto& contour : contours_host) {// 使用OpenCV获取边界矩形Rect bounding_rect = boundingRect(contour);// 确保边界矩形不会超出图像边界bounding_rect &= Rect(0, 0, src.cols, src.rows);// 额外检查以防止空矩形或其他问题if (bounding_rect.width == 0 || bounding_rect.height == 0) continue;// 在原图上绘制矩形rectangle(src_color, bounding_rect.tl(), bounding_rect.br(), Scalar(0, 255, 0), 2);}// 显示结果imshow("Bounding Rect", src_color);waitKey();return 0;
}

运行结果

在这里插入图片描述

http://www.xdnf.cn/news/2015.html

相关文章:

  • vue2实现Blod文件流下载
  • 使用ACME给动态域名下的Synology NAS免费申请SSL证书(无需开放80/443端口)
  • Docker拉取镜像代理配置实践与经验分享
  • 「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(一)
  • SQLAlchemy 2.x 异步查询方法比较
  • Android 14 修改侧滑手势动画效果
  • xfce桌面汉化设置
  • 【防火墙 pfsense】2配置
  • 豆瓣图书数据采集与可视化分析(三)- 豆瓣图书数据统计分析
  • OSPF网络协议
  • Antd Modal Drawer 更改默认项
  • WSL 安装过程整理
  • 应用在物联网设备的爱普生可编程晶振SG-8018CA
  • Redis是单线程的,如何提高多核CPU的利用率?
  • 大学IP广播系统解决方案:构建数字化智慧化大学校园IP广播平台
  • 【含文档+PPT+源码】基于微信小程序的校园快递平台
  • HTML 模板技术与服务端渲染
  • 京东平台关键字搜索接口开发指南:Python实现与代码详解
  • PicoVR眼镜在XR融合现实显示模式下无法显示粒子问题
  • 大模型扫盲之推理性能指标全面详解
  • linux系统问题杂谈
  • Framework模块编译脚本利器
  • KafkaSpark-Streaming
  • C语言数据类型全面解析:从入门到精通
  • Django【应用 01】django-plotly-dash安装及使用
  • Java 设计模式心法之第22篇 - 备忘录 (Memento) - 捕获与恢复对象状态的“时光机”
  • 力扣-160.相交链表
  • 制作一款打飞机游戏23:编辑器ui
  • kafka与flume的整合、spark-streaming
  • Virtio 技术解析 | 框架、设备实现与实践指南