OpenCV3/C++中轮廓提取与错误处理

11 下载量 201 浏览量 更新于2024-08-29 收藏 227KB PDF 举报
"本文主要介绍在OpenCV3中如何使用C++进行轮廓的提取与筛选,包括findContours函数的使用以及解决可能出现的报错问题,同时讲解了drawContours函数用于绘制轮廓的方法。" 在计算机视觉领域,轮廓检测是图像处理中的关键步骤,它可以帮助我们识别和分割图像中的物体。OpenCV库提供了强大的函数来处理这一任务,特别是`findContours`和`drawContours`这两个函数。 `findContours`函数是OpenCV中用于提取图像轮廓的核心函数。其参数含义如下: 1. `InputOutputArray binImg`:输入8位图像,通常为二值图像,0值表示背景,非0值表示前景。 2. `OutputArrayOfArrays contours`:输出找到的轮廓对象,是一个二维向量,每一层表示一个轮廓,每个轮廓由一系列点(Point)组成。 3. `OutputArray hierarchy`:输出图像的拓扑结构,用于表示轮廓之间的层次关系。 4. `int mode`:轮廓返回的模式,例如`RETR_EXTERNAL`(仅返回最外层轮廓)、`RETR_LIST`(所有轮廓按层次顺序)、`RETR_TREE`(完整层次结构)或`RETR_CCOMP`(两层结构)。 5. `int method`:发现方法,如`CHAIN_APPROX_SIMPLE`(压缩水平、垂直和对角线方向的重复点),`CHAIN_APPROX_NONE`(保留所有点)等。 6. `Point offset`:轮廓像素的位移,默认为(0, 0)。 在实际使用中,可能会遇到`findContours`函数报错,如“已触发了一个断点”。为了解决这类问题,可以尝试以下方法: 1. 为`contours`向量提前分配空间,避免动态内存分配导致的问题。例如,`std::vector<std::vector<Point>> contours(500)`预先分配500个轮廓的空间。 2. 如果是在Debug模式下出现此类错误,可以尝试切换到Release模式运行,因为Release模式下的优化可能有助于消除这类问题。 提取出轮廓后,可以使用`drawContours`函数将轮廓绘制到图像上,以便可视化。该函数的参数包括: 1. `InputOutputArray img`:输出图像,将在其中绘制轮廓。 2. `OutputArrayOfArrays contours`:找到的全部轮廓对象。 3. `int contourIdx`:要绘制的轮廓索引号,如果为负值,表示绘制所有轮廓。 4. `const Scalar& color`:绘制的线条颜色。 5. `int thickness`:线条宽度。 6. `int lineType`:线条类型,如`8`连接(默认)或`4`连接。 7. `InputArray hierarchy`:拓扑结构图,与`findContours`中的相同。 8. `int maxLevel`:最大层数,0表示只绘制当前轮廓,1表示绘制当前及内嵌轮廓。 9. `Point offset`:轮廓位移。 以下是一个简单的使用示例: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat src, dst; src = imread("E:/image/image/shape.jpg"); if (src.empty()) { printf("cannot load image\n"); return -1; } namedWindow("input", CV_WINDOW_AUTOSIZE); imshow("input", src); dst = Mat::zeros(src.size(), CV_8UC1); // ...二值化等预处理步骤... std::vector<std::vector<Point>> contours; std::vector<int> hierarchy; findContours(binImg, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); drawContours(dst, contours, -1, Scalar(255, 0, 0), 2, 8, hierarchy, 0, Point()); imshow("output", dst); waitKey(0); return 0; } ``` 这个示例首先加载图像,然后进行预处理得到二值图像,接着调用`findContours`提取轮廓,最后用`drawContours`在新图像`dst`上绘制轮廓,并显示结果。通过调整不同的参数,可以根据具体需求对轮廓进行更复杂的操作,如筛选、测量、形状分析等。