OpenCV3/C++中轮廓提取与错误处理
62 浏览量
更新于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`上绘制轮廓,并显示结果。通过调整不同的参数,可以根据具体需求对轮廓进行更复杂的操作,如筛选、测量、形状分析等。
3066 浏览量
1742 浏览量
155 浏览量
339 浏览量
290 浏览量
179 浏览量
993 浏览量
weixin_38724106
- 粉丝: 3
- 资源: 911
最新资源
- fetch-with-loading:fetch-with-loading 是一个带有 loading 的 promise 扩展库
- XX网络文化传媒股份有限公司商业计划书
- .scripts
- matlab开发-VersatileModulator
- webex-teams-sdk-wrapper:使用此包装程序,只需几行代码即可将Webex Teams视频通话嵌入到您的Android应用程序中
- gostack11-desafio8-gomarketplace-mobile
- completion-map:Wyandotte节点完成状态
- webmagic 0.7.3 源码+jar.zip
- XX私人牧场会员俱乐部商业计划书
- conch:无需密钥对即可快速SSH到公共EC2实例的实用程序
- 免费36篇神经网络经典论文
- gCMS-开源
- 博客
- Spider-Man: Homecoming Wallpapers New Tab-crx插件
- matlab开发-Meshcrosssections
- 户外探险PSD分层海报设计