opencv寻找轮廓

来源:互联网 发布:linux wc 统计行数 编辑:程序博客网 时间:2024/05/16 09:03

1. 一个轮廓一般对应一系列的点,也就是图像中的一条曲线,有多种方法来表示曲线,opencv中一般用序列来存储轮廓信息。函数cvFindContours()用来从二值图像中寻找轮廓,可以来自于边缘检测后的图像,也可以是二值化后的图像,cvFindContours()可以找到图像中的外围轮廓和内部的孔洞,函数原型如下:



第一个参数是输入图像,必须是8位的单通道的图像,所以输入的应该是二值图,下一个参数是内部存储器,找到的轮廓存储在里面,再下一个参数是一个CvSeq指针,headerSize是关于对象的信息,一般设置成sizeof(CvContour),最后两个参数是指定计算方法和如何计算。

mode表示检索的模式有四个选项:

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

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

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

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

method表示边缘近似方法,有五个选项:

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

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

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

CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用the flavors of Teh-Chin chain近似算法的一种。 

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


找到轮廓之后可以绘制出来,可以用函数cvDrawContours(),函数原型如下:



第一个参数表示要绘制的图像,第二个参数表示要绘制的轮廓,第三个参数外围轮廓的颜色,第四个参数内部轮廓的颜色。 max_level 画轮廓的最大层数。如果是0,只绘制contour;如果是1,将绘制contour后和contour同层的所有轮廓;如果是2,绘制contour后所有同层和低一层的轮廓,以此类推;如果值是负值,则函数并不绘制contour后的轮廓,但是将画出其子轮廓,一直到abs(max_level) - 1层。 thickness 绘制轮廓线的宽度。如果为负值(例如,等于CV_FILLED),则contour内部将被绘制。 line_type 轮廓线段的类型。

下面是在在一幅图像中找到轮廓并显示:

源码:

#include <cv.h>#include <highgui.h>IplImage*    g_image = NULL;IplImage*    g_gray = NULL;int        g_thresh = 100;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 = 0;cvCvtColor(g_image, g_gray, CV_BGR2GRAY);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(int argc, char** argv){g_image = cvLoadImage("99.jpg");cvNamedWindow("Contours", 1);cvCreateTrackbar("Threshold","Contours",&g_thresh,255,on_trackbar);on_trackbar(0);cvWaitKey(0);return 0;}



结果:



0 0