openCV-轮廓

环境: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 ;

}

原图及效果图如下:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41425655/article/details/81414861