cv::findContours函数参数详解

本文详细介绍了OpenCV中的findContours函数,用于从二值图像中提取轮廓。函数涉及的参数包括image(输入图像,通常是二值图)、contours(输出轮廓的双重向量)、hierarchy(存储轮廓层次关系的向量)、mode(轮廓检索模式,如CV_RETR_EXTERNAL仅提取最外层轮廓)、method(轮廓近似方法,如CV_CHAIN_APPROX_SIMPLE仅保存拐点信息)以及offset(轮廓点的偏移量)。文章通过实例解析了这些参数的含义和用法,帮助理解轮廓检测的过程。

1.findContours函数原型

cv::findContours 函数从二值图像中提取轮廓,返回值为轮廓的数目.

Opencv 中通过使用 findContours 函数,简单几个的步骤就可以检测出物体的轮廓,很方便。

findContours 方法中各参数的含义及用法,比如要求只检测最外层轮廓该怎么办?contours 里边的数据结构是怎样的?hierarchy 到底是什么鬼?Point() 有什么用?

先从findContours函数原型看起:

findContours( InputOutputArray image, 
			  OutputArrayOfArrays contours,
              OutputArray hierarchy, 
              int mode,
              int method, 
              Point offset=
OpenCV 中的 `cv::findContours` 函数通常用于从二值图像中提取轮廓,它在形状分析、对象检测和图像分割等任务中非常有用。然而,在某些情况下,可能需要限制查找轮廓的区域,例如只在图像的特定部分中查找轮廓。这时可以使用掩膜(mask)来实现这一目的。 虽然标准的 `cv::findContours` 函数原型并没有直接提供一个名为 `mask` 的参数[^3],但可以通过对输入图像进行预处理来间接实现该功能。具体方法是:将掩膜应用到原始图像上,使得仅掩膜感兴趣的区域保留下来,其余部分被置为 0 或忽略。 以下是实现思路: 1. **准备掩膜图像**:创建一个与输入图像大小相同的单通道掩膜图像。在掩膜中,感兴趣区域设置为白色(255),非感兴趣区域设置为黑色(0)。 2. **应用掩膜**:使用 `cv::bitwise_and` 函数将掩膜应用于原始图像,这样输出图像中只有掩膜的白色区域才会保留原图像的信息,其他区域变为黑色。 3. **调用 findContours**:在经过掩膜处理后的图像上调用 `cv::findContours` 函数,从而只在指定区域内检测轮廓。 以下是一个简单的代码示例,展示如何结合掩膜使用 `cv::findContours`: ```cpp #include <opencv2/opencv.hpp> #include <vector> int main() { // 假设已经有一个二值图像 src cv::Mat src = cv::imread("binary_image.png", cv::IMREAD_GRAYSCALE); cv::Mat mask = cv::imread("mask_image.png", cv::IMREAD_GRAYSCALE); // 掩膜图像 // 应用掩膜 cv::Mat maskedImage; cv::bitwise_and(src, src, maskedImage, mask); // 查找轮廓 std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; cv::findContours(maskedImage, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // 绘制轮廓 cv::Mat drawing = cv::Mat::zeros(src.size(), CV_8UC3); for (size_t i = 0; i < contours.size(); i++) { cv::drawContours(drawing, contours, static_cast<int>(i), cv::Scalar(0, 255, 0), 2, 8, hierarchy); } cv::imshow("Contours", drawing); cv::waitKey(0); return 0; } ``` 通过这种方式,可以在 `cv::findContours` 中有效地利用掩膜来限定轮廓检测的区域,提高算法的灵活性和效率。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值