C++ OpenCV轮廓发现

Posted 微卡智享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ OpenCV轮廓发现相关的知识,希望对你有一定的参考价值。

轮廓发现(find contour)

轮廓即是以某种方式表示图像中的曲线的点的列表。这种表示可以根据实际的情形不同而不同。表示一条曲线的方式有很多种。

轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现的结果。

OpenCV中,轮廓是由STL风格的vector<>模板对象表示的,其中vector中的每个元素都编码了曲线上,下一点的位置信息。


先上干货

Demo视频显示效果



相关API介绍

  • findContours    (发现轮廓)

  • drawContours  (绘制轮廓)


findContours(  

    InputOutputArray image, // 输入的8位单通道“二值”图像  

    OutputArrayOfArrays contours, // 全部发现的轮廓图像,包含points的vectors的vector  

    OutputArray hierarchy, // (可选) 拓扑信息  ,轮廓的发现方法正是基于图像的拓扑结构实现。

    int mode, // 轮廓检索模式  

    int method, // 近似方法  

    Point offset = Point() // (可选) 所有点的偏移,默认(0.0)没有位移

); 


int mode这个参数拓扑信息是用何种方式进行提取,提取的方法有四种

  • cv::RETR_EXTERNAL:表示只提取最外面的轮廓;

  • cv::RETR_LIST:表示提取所有轮廓并将其放入列表;

  • cv::RETR_CCOMP:表示提取所有轮廓并将组织成一个两层结构,其中顶层轮廓是外部轮廓,第二层轮廓是“洞”的轮廓;

  • cv::RETR_TREE:表示提取所有轮廓并组织成轮廓嵌套的完整层级结构。


int method参数是见识方法,即轮廓如何呈现的方法,有三种可选方法:

  • cv::CHAIN_APPROX_NONE:将轮廓中的所有点的编码转换成点;

  • cv::CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角直线段,仅保留它们的端点;

  • cv::CHAIN_APPROX_TC89_L1 or cv::CHAIN_APPROX_TC89_KCOS:应用Teh-Chin链近似算法中的一种风格




drawContours(  

    InputOutputArray image, // 用于绘制的输入图像  

    InputArrayOfArrays contours, // 全部发现的轮廓图像,点的vectors的vector  

    int contourIdx, // 需要绘制的轮廓的指数 (-1 表示 "all")  

    const Scalar& color, // 轮廓的颜色  

    int thickness = 1, // 轮廓线的宽度  

    int lineType = 8, //  轮廓线的邻域模式('4'邻域 或 '8'邻域)  

    InputArray hierarchy = noArray(), // 可选 (从 findContours得到)  

    int maxLevel = INT_MAX, // 轮廓中的最大下降  

    Point offset = Point() // (可选) 所有点的偏移  



代码演示

新建一个项目opencv-0023,配置属性(),然后在源文件写入#include和main方法

C++ OpenCV轮廓发现


首先我们定义阈值和方法

C++ OpenCV轮廓发现

然后在main方法里面增加创建两个trackbar

C++ OpenCV轮廓发现

drawocuntours方法

C++ OpenCV轮廓发现

C++ OpenCV轮廓发现


运行效果

C++ OpenCV轮廓发现





-END-




以上是关于C++ OpenCV轮廓发现的主要内容,如果未能解决你的问题,请参考以下文章

图像轮廓检测错误:OpenCV、C++

OpenCV红绿灯识别 轮廓识别 C++ OpenCV 案例实现

求C++中利用opencv计算轮廓图像傅里叶描述子的代码

OpenCV 中的轮廓比较(从 C 到 C++ 的转换)

OpenCV C++案例实战八《基于Hu矩轮廓匹配》

OpenCV 图像轮廓