[C++]opencv中findContours函数用法

cv::findContours 是 OpenCV 库中用于在二值图像中查找轮廓的函数。该函数非常强大,可以用于图像分割、形状分析等任务。以下是对 cv::findContours 函数的详细介绍:

函数原型

在 C++ 接口中,cv::findContours 的函数原型通常如下:

cpp 复制代码
void cv::findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy,
                      int mode, int method, Point offset = Point())

参数说明

  1. image

    • 类型:InputOutputArray
    • 描述:输入的二值图像。这个函数通常在二值图像上操作,因此输入的图像应该是经过阈值处理后的图像,其中对象的像素值为非零(如255,表示白色),背景的像素值为0(表示黑色)。
  2. contours

    • 类型:OutputArrayOfArrays
    • 描述:用于存储检测到的轮廓的容器。这通常是一个 std::vector<std::vector<cv::Point>> 类型的变量,其中每个内部 vector<cv::Point> 表示一个轮廓,由一系列的点组成。
  3. hierarchy(可选):

    • 类型:OutputArray
    • 描述:用于存储轮廓之间的层次结构信息的容器。这是一个可选参数,如果你不需要轮廓之间的层级关系,可以将其设置为空(不传递或使用默认值)。如果传递了这个参数,它将被填充为一个 std::vector<Vec4i> 类型的变量,其中每个 Vec4i 表示一个轮廓的层级信息,包括当前轮廓的下一个轮廓、前一个轮廓、第一个子轮廓和父轮廓的索引。
  4. mode

    • 类型:int
    • 描述:轮廓检索模式,决定了 cv::findContours 函数如何检索轮廓。常用的模式有:
      • 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_L1cv::CHAIN_APPROX_TC89_KCOS:使用 Teh-Chin 链近似算法的一种。
  6. offset(可选):

    • 类型:Point
    • 描述:轮廓点的偏移量。这是一个可选参数,默认为 cv::Point(0, 0),表示不进行偏移。当轮廓是从图像的某个区域(ROI)中提取的,并且需要在整个图像中分析时,这个参数将很有用。

返回值

cv::findContours 函数没有返回值(即返回类型为 void),但它通过修改传入的 contours 和(可选的)hierarchy 参数来输出轮廓和层级信息。

使用示例

以下是一个简单的使用 cv::findContours 函数的示例:

cpp 复制代码
#include <opencv2/opencv.hpp>
int main() {
    cv::Mat image = cv::imread("your_binary_image.jpg", cv::IMREAD_GRAYSCALE); // 加载二值图像
    cv::Mat binary;
    cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY); // 确保图像是二值的
    std::vector<std::vector<cv::Point>> contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours(binary, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
    // 在这里可以使用 contours 和 hierarchy 进行进一步的处理,比如绘制轮廓等
    return 0;
}

通过 cv::findContours 函数,可以轻松地在二值图像中检测对象的轮廓,为后续的图像分析和处理提供基础。

相关推荐
晓晓hh3 小时前
JavaSE学习——迭代器
java·开发语言·学习
Laurence3 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
kyriewen113 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5
014-code3 小时前
String.intern() 到底干了什么
java·开发语言·面试
421!3 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
蒸汽求职4 小时前
机器人软件工程(Robotics SDE):特斯拉Optimus落地引发的嵌入式C++与感知算法人才抢夺战
大数据·c++·算法·职场和发展·机器人·求职招聘·ai-native
charlee444 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测
摇滚侠4 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
Tanecious.4 小时前
蓝桥杯备赛:Day4-P9749 公路
c++·蓝桥杯
@insist1234 小时前
网络工程师-生成树协议(STP/RSTP/MSTP)核心原理与应用
服务器·开发语言·网络工程师·软考·软件水平考试