OpenCV - 轮廓练习一

我们检测输入图像的轮廓,然后追个绘制每个轮廓。

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <string.h>

using namespace std;
using namespace cv;

#define CVX_RED   CV_RGB(0xff, 0x00, 0x00)
#define CVX_GREEN CV_RGB(0x00, 0xff, 0x00)
#define CVX_BLUE  CV_RGB(0x00, 0x00, 0xff)

int main()
{
    /*1、载入一个图像*/
    const char filename[] = "/Users/linwang/Downloads/Lena.jpg";
    IplImage * image_8uc1 = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE);
    if(image_8uc1 == NULL)
    {
        cout<<"Img is NULL"<<endl;
        return 1;
    }
    IplImage * image_edge = cvCreateImage(cvGetSize(image_8uc1), 8, 1);
    IplImage * image_8uc3 = cvCreateImage(cvGetSize(image_8uc1), 8, 3);
    
    /*2、二值化图像,像素大于128的为255,小于128的为0*/
    cvThreshold(image_8uc1, image_edge, 128, 255, CV_THRESH_BINARY);
    
    /*3、创建一个内存储存器 默认为 64K */
    CvMemStorage * storage = cvCreateMemStorage();
    
    /*4、创建一个序列CvSeq变量*/
    CvSeq * first_contour = NULL;
    int Nc = cvFindContours(
                            image_edge,
                            storage,               //存储轮廓元素的储存容器
                            &first_contour,        //指向第一个输出轮廓
                            sizeof(CvContour),
                            CV_RETR_LIST           //提取所有轮廓,并且放置在 list 中
                            );
    //分别替换成CV_RETR_EXTERNAL
    /*5、绘制轮廓*/
    int n = 0;
    cvCvtColor(image_8uc1, image_8uc3, CV_GRAY2BGR);
    cout<<"Total Contours Detected: "<<Nc<<endl;
    for(CvSeq * c = first_contour;c!= NULL; c = c->h_next)
    {
        
        cvDrawContours(
            image_8uc3,   //用于绘制轮廓的图像
            c,            //指向目前轮廓所在地址空间
            CVX_BLUE,      //外层轮廓颜色
            CVX_RED,     //内层轮廓颜色
            100,            //等级为0,绘制单独的轮廓
            2,            //轮廓线条粗细
            8             //线段类型为(8邻接)连接线
        );
        cout<<"Contour : "<<n<<endl;
    //  cvShowImage("lun kuo", image_8uc3);
        cout<<c->total<<" elements : "<<endl;
        for(int i = 0;i<c->total;i++)
        {
            CvPoint * p = CV_GET_SEQ_ELEM(CvPoint, c, i);
            cout<<"("<<p->x<<","<<p->y<<")"<<endl;
        }
      // cvWaitKey(0);
        n++;
    }
    cout<<"Finished all contours"<<endl;
    cvShowImage("Src", image_8uc3);
    cvCvtColor(image_8uc1, image_8uc3, CV_GRAY2BGR);
    cvShowImage("8u3c", image_8uc3);
    cvWaitKey(0);
    cvReleaseImage(&image_8uc3);
    cvReleaseImage(&image_edge);
    cvReleaseImage(&image_8uc1);
    return 0;
}


发布了192 篇原创文章 · 获赞 14 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/u011559236/article/details/78725606