首页 > 其他分享 >OpenCV(cv::findContours())

OpenCV(cv::findContours())

时间:2024-09-03 13:48:30浏览次数:7  
标签:hierarchy RETR findContours OpenCV contours 图像 轮廓 cv

目录



cv::findContours() 是 OpenCV 中用于检测图像中的轮廓的函数。

1. 函数定义

void findContours(
    InputOutputArray image, 
    OutputArrayOfArrays contours, 
    OutputArray hierarchy, 
    int mode, 
    int method, 
    Point offset = Point()
);

参数:

  1. image:

    • 类型: InputOutputArray(通常是二值化后的图像)
    • 描述: 输入图像,通常是灰度图像或二值图像。该图像会被函数修改,因此如果你想保留原始图像,建议传入其副本。可以使用 cv::Canny()cv::threshold() 生成适合轮廓检测的二值图像。
  2. contours:

    • 类型: OutputArrayOfArrays
    • 描述: 输出的轮廓。每个轮廓是一个点的列表。例如,contours[i] 表示第 i 个轮廓,它是图像中一系列连接的点集。
  3. hierarchy:

    • 类型: OutputArray
    • 描述: 输出的轮廓层次结构。它是一个包含四个整数的向量,分别表示同一级别的前一个轮廓、下一个轮廓、父轮廓和子轮廓。通过该层次结构可以了解轮廓之间的嵌套关系。
  4. mode:

    • 类型: int
    • 描述: 轮廓的检索模式,决定如何组织轮廓数据。取值可以是:
      • cv::RETR_EXTERNAL: 只提取外部轮廓,即不考虑嵌套的轮廓。
      • cv::RETR_LIST: 提取所有的轮廓,但不创建层次关系。
      • cv::RETR_CCOMP: 提取所有的轮廓并将它们组织成两级层次。顶层是外部轮廓,第二层是内部轮廓。
      • cv::RETR_TREE: 提取所有轮廓并重构完整的嵌套轮廓的层次结构。
  5. method:

    • 类型: int
    • 描述: 轮廓的近似方法。取值可以是:
      • cv::CHAIN_APPROX_NONE: 存储所有的轮廓点,不进行压缩。
      • cv::CHAIN_APPROX_SIMPLE: 仅存储拐点信息(去除冗余的中间点)。
      • cv::CHAIN_APPROX_TC89_L1, cv::CHAIN_APPROX_TC89_KCOS: 使用 Teh-Chin 链逼近算法。
  6. offset:

    • 类型: Point
    • 描述: 轮廓中所有点的偏移量。这在需要对轮廓点进行平移时非常有用。

返回值:

该函数没有返回值。轮廓信息通过 contourshierarchy 输出。



2. 示例

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int main() {
    Mat src = imread("image.png", IMREAD_GRAYSCALE);
    Mat binarized;
    threshold(src, binarized, 128, 255, THRESH_BINARY);

    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;

    // 检测轮廓
    findContours(binarized, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);

    // 绘制轮廓
    Mat output = Mat::zeros(src.size(), CV_8UC3);
    for (size_t i = 0; i < contours.size(); i++) {
        drawContours(output, contours, static_cast<int>(i), Scalar(0, 255, 0), 2, 8, hierarchy);
    }

    imshow("Contours", output);
    waitKey(0);
    return 0;
}

功能解析:

  • 二值化图像: 为了使 cv::findContours() 正常工作,输入图像通常需要二值化(即背景和前景分离)。通过 cv::threshold()cv::Canny() 可以生成二值图像。

  • 轮廓近似: 使用 CHAIN_APPROX_SIMPLE 会显著减少存储轮廓的点数,因为它只会存储关键点,如直线段的拐点。这在处理复杂图像时,可以显著减少内存消耗。

  • 层次结构: hierarchy 数组能够提供轮廓的嵌套关系。例如,可以通过层次结构分析一个轮廓是否是另一个轮廓的子轮廓(例如洞内的对象)。这在分析复杂的图像时很有用。



3. 常见应用

  1. 对象检测: 检测并标记图像中的物体轮廓。
  2. 形状分析: 使用轮廓数据进行形状匹配和分析,例如计算轮廓的周长、面积等。
  3. 目标分割: 通过检测并处理轮廓,可以将图像中的对象分割出来用于后续处理。


4. 注意事项

  • 输入图像: cv::findContours() 会修改输入图像,因此如果需要保留原始图像,应该传递图像的副本。
  • 轮廓检测模式: 根据应用场景选择合适的 mode,例如在需要层次结构时选择 RETR_TREE,而只需要外部轮廓时选择 RETR_EXTERNAL
  • 图像预处理: 确保输入图像经过适当的预处理(如二值化),以获得正确的轮廓结果。


标签:hierarchy,RETR,findContours,OpenCV,contours,图像,轮廓,cv
From: https://www.cnblogs.com/keye/p/18394396

相关文章

  • OpenCV(图像像素遍历方法比较)
    目录1.使用场景2.示例代码3.示例代码解析3.1头文件和命名空间3.2主函数main3.2.1创建并初始化矩阵A3.2.2随机初始化矩阵A的值3.2.3克隆矩阵3.2.4使用动态地址操作法进行矩阵操作并计时3.2.5使用迭代器操作法进行矩阵操作并计时3.2.6使用指针操作法进行矩阵操作并计时3......
  • 【全网独家】OpenCV基本结构(Point、Size、Rect等)
    1.简介OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库。它提供了上千种图像处理和计算机视觉算法,广泛应用在各种领域,如机器人学、实时图像处理、模式识别等。2.基本结构介绍PointPoint用于表示图像中的二维点。可以用Point_<T>模......
  • OpenCV(cv::Mat 类的成员函数 ptr<T>())
    目录1.函数定义2.功能3.示例4.注意事项总结在OpenCV中,Mat类的成员函数ptr<T>()用于获取指向矩阵数据的指针,允许直接访问底层数据。T是指针的类型,它通常与矩阵的元素类型对应。通过这个函数,你可以以一种低开销的方式访问和修改矩阵数据。1.函数定义template<type......
  • 安防监控/视频汇聚EasyCVR视频监控平台级联上级无法播放是什么原因?
    EasyCVR视频监控平台,作为一款智能视频监控综合管理平台,凭借其强大的视频融合汇聚能力和灵活的视频能力,在各行各业的应用中发挥着越来越重要的作用。EasyCVR视频汇聚平台采用先进的图像处理技术和传输协议,能够确保高清、稳定的视频传输。同时,平台支持多种主流标准协议和厂家的私有......
  • 智慧安防EasyCVR视频监控汇聚平台云端录像时间轴拖动不跳转,是什么原因?
    视频汇聚EasyCVR视频智能管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力,为各行各业的视频监控需求提供了优秀的解决方案。EasyCVR平台支持多种视频流的外部分发,如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等,这为其在各种复杂环境......
  • wh~视觉~CV~合集1
     哈哈准备开始挪一些cv相的合集~ whaosoftaiotTaobao开发板商城天皓智联 www.143ai.com一、CVの文档自动扫描仪 介绍如何使用OpenCV+GrabCut实现一个文档自动扫描仪。背景介绍   文档扫描是将物理文档转换为数字形式的过程。可以通过扫描仪或手机摄像头拍摄图像来......
  • opencv学习:基础用法和图像添加边界框设置
    1.opencv基础用法1.从文件加载图像a=cv2.imread("1.jpg")b=cv2.imread("2.jpg")2.从文件读取视频video=cv2.VideoCapture("1.mp4")3.读摄像头cv2.VideoCapture(0)4.保存图片cv2.imwrite(r"1_gray.jpg",b)5.展示图片cv2.imshow("shuiju",a)6.释......
  • 《深度学习》OpenCV 图像边缘检测 算法解析及代码演示
    目录一、图像边缘检测1、什么是边缘检测2、常用的边缘检测算法        1)Sobel算子    2)Scharr算子        3)Canny边缘检测算法        4)Laplacian算子3、边缘检测流程        1)预处理        2)计算梯度     ......
  • 【OpenCV】快速入门(二)--视频处理(1)
    OpenCV–视频处理先看代码#include<iostream>#include"opencv2/highgui/highgui.hpp"#include"opencv2/imgproc/imgproc.hpp"intmain(intargc,char**argv){cv::namedWindow("Example3",cv::WINDOW_AUTOSIZE);cv::VideoCaptu......
  • 开机就能打?没那么玄乎!客观分析 “狂躁许可”漏洞(CVE-2024-38077)及其影响范围
    一、事件背景2024年7月9日,微软官方发布了一个针对“windows远程桌面授权服务远程代码执行漏洞”(CVE-2024-38077)的修复补丁包,起初并没有引起大家的警觉。今日在国外某网站上疑似漏洞的作者公开了该漏洞的“POC验证代码”。一时激起千层浪,该漏洞开始疯狂发酵并在安全圈里转发。该文章......