我们检测输入图像的轮廓,然后追个绘制每个轮廓。
#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;
}