[C++] opencv - findContours(查找轮廓)函数介绍和使用场景

27 篇文章 1 订阅

findContours函数介绍

C++ OpenCV中的findContours函数用于在二值图像中检测轮廓。它可以将图像中的连续区域(通常是物体)提取出来,形成一个轮廓集合。这个函数非常适用于计算机视觉任务,如目标检测、图像分割等。

C++ OpenCV中的findContours函数原型如下:

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

参数说明:

  • image:输入的二值图像,通常是经过边缘检测、阈值处理等操作得到的。
  • contours:输出的轮廓集合,每个轮廓由一系列点组成。
  • hierarchy:输出的轮廓层次结构,用于表示轮廓之间的父子关系。
  • mode:轮廓检索模式,常用的有RETR_EXTERNAL(只检测最外层轮廓)、RETR_LIST(检测所有轮廓)、RETR_CCOMP(检测所有轮廓并按从左到右的顺序排列)和RETR_TREE(检测所有轮廓并建立轮廓树)。
  • method:轮廓近似方法,常用的有CHAIN_APPROX_NONE(存储所有顶点)、CHAIN_APPROX_SIMPLE(仅存储水平、垂直方向上的顶点)和CHAIN_APPROX_TC89_L1(使用TEH_CHAIN近似算法)。
  • offset:轮廓点偏移量,默认为(0, 0)。

使用场景

除了图像分割,OpenCV的findContours函数还可以应用于以下场景:

  1. 目标检测和识别:在视频流或图像中检测和识别特定目标,如人脸、车辆、行人等。

  2. 文字识别:对印刷体文字图像进行轮廓提取和分析,以便进行后续的文字识别和处理。

  3. 医学影像分析:在医学影像中查找和分析病变区域,如肿瘤、炎症等。

  4. 机器人导航:在机器人导航中,通过检测地面上的障碍物和道路边界来规划路径。

  5. 三维重建:在三维重建中,通过检测物体表面的轮廓来确定物体的位置和形状。

使用案例

假设我们有一个二值图像,其中包含一个圆形和一个矩形。我们可以使用findContours函数来检测这两个形状的轮廓。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    // 读取灰度图像
    Mat src = imread("./3480e7ce_mk_tk_a_c2_6400_4480.png", IMREAD_GRAYSCALE);
    if (src.empty())
    {
        cout << "无法读取图像" << endl;
        return -1;
    }
    imshow("原图", src);
    waitKey(0);
    // 二值化图像
    Mat binary;
    threshold(src, binary, 128, 255, THRESH_BINARY);
    imshow("二值化图", binary);
    waitKey(0);

    // 查找轮廓
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

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

    // 显示结果
    imshow("轮廓图", result);
    waitKey(0);

    return 0;
}

运行效果:

二值化图像:

 轮廓图:

总结

OpenCV中的findContours函数可以在二值图像中检测轮廓,非常适用于计算机视觉任务。通过查找轮廓,我们可以提取出图像中的连续区域,从而进行目标检测、图像分割等操作。

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C++OpenCV中,findContours函数用于查找图像中的轮廓。其函数原型如下: ```cpp void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point()); ``` 其中, - InputOutputArray image:输入图像,必须为8位单通道二进制图像。 - OutputArrayOfArrays contours:输出轮廓,为一个向量类型,包含所有检测到的轮廓。 - OutputArray hierarchy:轮廓的层次结构,可不传入该参数。 - int mode:轮廓检索模式,可取值为RETR_EXTERNAL、RETR_LIST、RETR_CCOMP和RETR_TREE。 - int method:轮廓逼近方法,可取值为CHAIN_APPROX_NONE、CHAIN_APPROX_SIMPLE、CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS。 - Point offset:轮廓点的可选偏移量。 例如,下面的代码使用findContours函数查找图像中的轮廓并在图像中绘制出来: ```cpp Mat image = imread("example.jpg", IMREAD_GRAYSCALE); Mat binary; threshold(image, binary, 100, 255, THRESH_BINARY); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point()); Mat result = Mat::zeros(image.size(), CV_8UC3); for (size_t i = 0; i < contours.size(); i++) { drawContours(result, contours, i, Scalar(0, 0, 255), 2, 8, hierarchy); } imshow("result", result); ``` 其中,先使用threshold函数将图像二值化,然后使用findContours函数查找轮廓,并使用drawContours函数轮廓绘制在新的图像上,最后显示结果图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老狼IT工作室

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值