OpenCV3/C++中轮廓提取与错误处理
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`上绘制轮廓,并显示结果。通过调整不同的参数,可以根据具体需求对轮廓进行更复杂的操作,如筛选、测量、形状分析等。
2023-05-13 上传
2023-03-28 上传
2023-05-30 上传
2023-05-31 上传
2023-05-26 上传
2024-03-08 上传
weixin_38724106
- 粉丝: 3
- 资源: 911
最新资源
- 十种常见电感线圈电感量计算公式详解
- 军用车辆:CAN总线的集成与优势
- CAN总线在汽车智能换档系统中的作用与实现
- CAN总线数据超载问题及解决策略
- 汽车车身系统CAN总线设计与应用
- SAP企业需求深度剖析:财务会计与供应链的关键流程与改进策略
- CAN总线在发动机电控系统中的通信设计实践
- Spring与iBATIS整合:快速开发与比较分析
- CAN总线驱动的整车管理系统硬件设计详解
- CAN总线通讯智能节点设计与实现
- DSP实现电动汽车CAN总线通讯技术
- CAN协议网关设计:自动位速率检测与互连
- Xcode免证书调试iPad程序开发指南
- 分布式数据库查询优化算法探讨
- Win7安装VC++6.0完全指南:解决兼容性与Office冲突
- MFC实现学生信息管理系统:登录与数据库操作