注意:转载请注明出处!

图像处理中的边缘检测是根据像素间的差异检测出轮廓边缘的像素,但它没有将轮廓作为一个整体。将这些轮廓边缘像素组装成一个整体(轮廓),就要进行轮廓检测.opencv提供了轮廓检测的函数cvFindContours,函数参数如下:

cvFindContours(CvArr *图像,CvMemStorage *存储,CvSeq ** first_contour,
                            int header_size CV_DEFAULT(sizeof(CvContour)),
                            int模式CV_DEFAULT(CV_RETR_LIST),
                            int方法CV_DEFAULT(CV_CHAIN_APPROX_SIMPLE),
                            CvPoint偏移量CV_DEFAULT(cvPoint(0,0)) );

具体参数含义如下:

图片

8比特单通道的源二值图像。非零像素作为1处理,0像素保存不变。从一个灰度图像得到二值图像的函数有:cvThreshold,cvAdaptiveThreshold和cvCanny。

存储

返回轮廓的容器。

first_contour

输出参数,用于存储指向第一个外接轮廓。

header_size

header sequence列的尺寸。如果选择方法= CV_CHAIN_CODE,则header_size> = sizeof(CvChain);其他,则

header_size> = sizeof(CvContour)。

模式

CV_RETR_EXTERNAL:只检索最外面的轮廓;

CV_RETR_LIST:检索所有的轮廓,并将其放入列表中;

CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;

CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次。

蓝色表示v_next,绿色表示h_next

方法

边缘近似方法(除了CV_RETR_RUNS使用内置的近似,其他模式均使用此设定的近似算法)可取值如下:

CV_CHAIN_CODE:以弗里曼链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。

CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。

CV_CHAIN_APPROX_SIMPLE:压缩水平的,垂直的和斜的部分,也就是,函数只保留他们的终点部分。

CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用Teh-Chin链的味道近似算法

的一种。

CV_LINK_RUNS:通过连接水平段的1,使用完全不同的边缘提取算法使用CV_RETR_LIST检索模式能使用此方法。

抵消

偏移量,用于移动所有轮廓点。当轮廓是从图像的ROI提取的,并且需要在整个图像中分析时,这个参数将很有用。

绘制检测轮廓的函数为:

cvDrawContours(CvArr * img,CvSeq * contour,
                             CvScalar external_color,CvScalar hole_color,
                             int max_level,int thickness CV_DEFAULT(1),
                             int line_type CV_DEFAULT(8),
                             CvPoint offset CV_DEFAULT(cvPoint(0,0)));

轮廓检测例子代码如下:

#include <cv.h>
#include <highgui.h>
using namespace cv;
using namespace std;
IplImage *g_image = NULL;
IplImage *g_gray = NULL;
int g_thresh = 10;
int g_Mathresh = 255;
CvMemStorage *g_storage = NULL;
void on_trackbar(int)
{
    if (g_storage == NULL)
    {
        g_gray = cvCreateImage(cvGetSize(g_image),8,1);
        g_storage = cvCreateMemStorage(0);
    }
    else
    {
        cvClearMemStorage(g_storage);
    }
    CvSeq *contours = NULL;
    cvCvtColor(g_image,g_gray,CV_RGB2GRAY);
    cvThreshold(g_gray,g_gray,g_thresh,255,CV_THRESH_BINARY);
    cvFindContours(g_gray,g_storage,&contours);
    cvZero(g_gray);
    if (contours)
    {
        cvDrawContours(g_gray,contours,cvScalarAll(255),cvScalarAll(255),100);
    }
    cvShowImage("Contours",g_gray);
}
int main()
{
    g_image=cvLoadImage("C:/Users/Administrator/Desktop/0.jpg");
    cvNamedWindow("Contours",1);
    cvCreateTrackbar("Threshold","Contours",&g_thresh,g_Mathresh,on_trackbar);
    on_trackbar(0);
    cvWaitKey();
    return 0;
}

原图如下:

检测效果如下:

Opencv查找轮廓并绘制相关推荐

  1. imutils基础(7)使用 OpenCV 查找轮廓中的极值点

    今天,我将使用 OpenCV 和 Python 根据轮廓查找极值点. 在本博客的其余部分,我将演示如何根据轮廓找到极北.极南.极东和极西 (x, y) 坐标,如本博文顶部的图像所示. 虽然这项技能本身 ...

  2. python使用opencv查找轮廓_(八)OpenCV-Python学习—轮廓查找,绘制和拟合

    针对物体轮廓,opencv还提供了一些相关的函数,来处理轮廓查找,绘制,拟合,以及计算轮廓周长和面积等,详细介绍如下: 1. 寻找和绘制轮廓 opencv的findContours()能寻找图片中的轮 ...

  3. python使用opencv查找轮廓_Python+opencv学习记录20:轮廓发现,Pythonopencv

    1.轮廓发现 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果. 1.1发现轮廓 在此步骤中我们会使用到findContours这个API,其原型为: ...

  4. OpenCV查找轮廓

    转自:http://westice.javaeye.com/blog/721225 主要函数是       cvFindContours(tour_buf,storage,&contour,s ...

  5. OpenCV 图像轮廓检测

    本文是OpenCV图像视觉入门之路的第15篇文章,本文详细的介绍了图像轮廓检测的各种操作,例如:轮廓检索模式.轮廓逼近算子等操作. 图像轮廓是具有相同颜色或灰度的连续点的曲线,轮廓在形状分析和物体的检 ...

  6. opencv 查找并绘制轮廓

    一个轮廓一般对应一系列的点, 也就是图像中的一条曲线.其表示方法可能根据不同的情况而有所不同. 在opencv中可以用findContours()函数从二值图像查找轮廓 findContours()函 ...

  7. Opencv——查找并绘制凸包、凸包与轮廓的关系

    定义 给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型. 理解物体形状或轮廓的一 种比较有用的方法便是计算一个物体的凸包,然后计算其凸缺陷(convexity defects). 检测 ...

  8. 使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制

    使用Python,OpenCV进行基本的图像处理--提取红色圆圈轮廓并绘制 1. 效果图 1.1 形态学图像处理效果图 1.2 转换HSV色彩空间提取 2. 源码 2.1 形态学图像处理提取源码 2. ...

  9. openCV专栏(八):图像轮廓:绘制轮廓

    OPENCV基础操作 提示:本专栏所用版本仅供参考,其他版本也可 库 版本 python Python 3.9.3 opencv 4.5.5 matplotlib 3.4.3 numpy 1.19.5 ...

  10. 使用Python,OpenCV进行涂鸦(绘制文字、线、圆、矩形、椭圆、多边形轮廓、多边形填充、箭头~)

    使用Python,OpenCV进行涂鸦(绘制文字.线.圆.矩形.椭圆.多边形轮廓.多边形填充.箭头) 1. 效果图 2. 原理 2.1 绘制线:cv2.line(canvas, (300, 0), ( ...

最新文章

  1. NASM学习之Windows下编写16位程序
  2. tab-pane 怎么家点击事件_想起爆款?怎么样去打造一个人见人点的爆款主图?
  3. 时间管理无非就是一个玩耍俄罗斯方块的过程,堆堆堆哈哈哈哈
  4. 利用 Docker 搭建单机的 Cloudera CDH 以及使用实践
  5. NB-IOT技术以及物联网安全问题简述
  6. 动态RAM的刷新(资料来源于网上自己查找搜索)
  7. 终于,我们的新产品Fotor Slideshow Maker上线了!!
  8. ArcGIS js Api 4.x修改三维球背景技巧
  9. mysql tuner sh_MySQL性能提议者:mysqltuner.pl
  10. 【分布式定时任务】定时任务实现几种方式
  11. position:fixed;支持ie6,清除e6下抖动。
  12. 利用计算机Tracert,tracert,教您tracert命令使用详解
  13. 由内而外全面造就自己
  14. 怎么画人体(动漫人体教程)
  15. 【自学C++】C++ cout clog cerr区别
  16. 10份可直接套用的华为项目管理模板
  17. vue:实现锚点双向滚动/文章章节联动滚动效果
  18. stress命令安装
  19. Linux中使用mvn命令(使用Maven:-bash:mvn:command not fonud)随笔
  20. 2010年4月51CTO壁纸点评活动获奖公告

热门文章

  1. usc计算机博士游戏专业,USC工科博士专业排名,必然得仔细的看
  2. file is not a zip file_如何使用JavaScript解压压缩后的zip文件
  3. python如何选择两种不同输入方式_从Python到空间分析arcpy || 第一回:关于连载的总介绍...
  4. python token验证失败百分百解决_微信公众号token验证失败解决方案
  5. Java基础(四):异常处理
  6. 计算几何——交点、面积的计算
  7. sqlserver常用语法
  8. 关于super关键字
  9. MVC5为WebAPI添加命名空间的支持
  10. 【转】小结登录的几种交互方式