环境:openCV3.4.0,Linux,CMake
1、一般用序列来存储轮廓信息;
2、在寻找轮廓前,图像一般已经进行过二值化,或自适应二值化,或者进行了卷积处理,获得了边缘信息,例如canny算子处理,拉普拉斯处理,sobel算子处理等获得图像边缘信息的处理方法。
3、序列用于记录找到的轮廓,当需要一个个处理找到的轮廓时,可以用cvFindContours、cvStartFindContours、cvFindNextContour、cvSubstituteContour、cvEndFindContour、cvApproxChains函数等进行特殊的操作,此处需要注意contour在序列中存储的顺序是根据cvFindContours的参数决定的,存储的轮廓的压缩方式,或者说是近似方式也是cvFindContours的参数决定的。
4、绘制轮廓用cvDrawContours函数进行即可,方便使用。
下面举一个例子。
#include "cv.h"
#include "highgui.h"
int main(int argc,char **argv)
{
//加载图片,三通道的,单通道的都可以
IplImage * g_image = NULL;
if(argc !=2 || !(g_image = cvLoadImage(argv[1])))
return -1;
//显示图片的窗口
cvNamedWindow("Contours",0);
//对图片进行灰度处理、二值化处理、寻找轮廓处理
IplImage * g_gray = NULL ;
int g_thresh = 100 ;
CvMemStorage * g_storage = NULL;
if(g_storage==NULL )
{
g_gray = cvCreateImage(cvGetSize(g_image),8,1);
g_storage = cvCreateMemStorage(0);//创建存储空间
}else{
cvClearMemStorage(g_storage); //清除mem的空间
}
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);
cvWaitKey(0);
return 0 ;
}
原图及效果图如下: