您的位置:首页 > 运维架构

opencv——提取轮廓

2014-10-01 15:44 141 查看
#include <iostream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std; 
//这个宏很重要,没有的话,结果是运行不出来的,原因还在研究~
#define OPENCV_FLANN_LOGGER_H

int main(int argc,char* argv[])
{
int i;
//创建并设置一个动态内存存储器,
CvMemStorage* storage = cvCreateMemStorage(0);
IplImage* img = cvLoadImage("C:\\Users\\wxh\\Documents\\Visual Studio 2010\\Projects\\9.29\\9.29\\3.jpg",0);
IplImage* imgcolor = cvCreateImage(cvGetSize(img),8,3);

IplImage* contoursImage =cvCreateImage(cvSize(img->width,img->height),8,1);

//创建2个序列 contours、contoursTemp,如果序列不会被传递给任何使用特定序列的函数,那么将它设为0。
//contours为轮廓的个数索引
CvSeq* contours = 0;
CvSeq* contoursTemp=0;
//令contoursImage的内容为0
cvZero(contoursImage);

//对图像进行二值化
cvThreshold(img,img,100,255,CV_THRESH_BINARY);
//把灰度图像变成彩色图像,存放在imgColor中
cvCvtColor( img, imgcolor,CV_GRAY2BGR);

//函数cvFindContours从二值图像中检索轮廓,并返回检测到的轮廓的个数。
//contours为存储轮廓点的CvSeq
//CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界
//CV_CHAIN_APPROX_NONE:将所有的连码点,转换成点。
//img必须是一个二值图像 storage 用来存储的contours指向存储的第一个轮廓
int total = cvFindContours(img,storage,&contours,sizeof(CvContour),CV_RETR_CCOMP,CV_CHAIN_APPROX_NONE,cvPoint(0,0));

//contour的值由cvFindContours函数填充返回,它的值为第一个外轮廓的指针,当没有轮廓被检测到时为NULL。
//所以contoursTemp指向第一个外轮廓
contoursTemp = contours ;

int count =0;

//访问每一个轮廓(横向轮廓)
for(;contoursTemp!=0;contoursTemp = contoursTemp->h_next)
{
// 提取一个轮廓的所有坐标点
for(i=0;i<contoursTemp->total;i++)
{
// 得到一个轮廓中一个点的函数cvGetSeqElem
CvPoint* pt = (CvPoint*)cvGetSeqElem(contoursTemp,i);
cvSetReal2D(contoursImage,pt->y,pt->x,255.0);
cvSet2D(imgcolor,pt->y,pt->x,cvScalar(0,0,255,0));

}
count++;
<pre name="code" class="csharp"> // 访问每个轮廓的纵向轮廓
CvSeq *InterCon = contoursTemp->v_next; for(; InterCon != 0; InterCon = InterCon ->h_next) { for(i = 0; i < InterCon->total; i++ ) { CvPoint *pt = (CvPoint*)cvGetSeqElem(InterCon, i); cvSetReal2D(contoursImage,
pt->y, pt->x, 255.0); cvSet2D(imgcolor, pt->y, pt->x, cvScalar(0, 255, 0, 0)); } } }

//显示图像
cvNamedWindow("1",1);
cvShowImage("1",img);
cvNamedWindow("2",1);
cvShowImage("2",imgcolor);
cvNamedWindow("3",1);
cvShowImage("3",contoursImage);
//等待按键触发
cvWaitKey(0);
//释放内存
cvReleaseImage(&img);
cvReleaseImage(&imgcolor);
cvReleaseImage(&contoursImage);
cvDestroyWindow("1");
cvDestroyWindow("2");
cvDestroyWindow("3");
//释放内部存储器的内存,注意:但该函数不会把内存释放给系统
cvReleaseMemStorage(&storage);
return 0;

}

运行结果:

窗口 1 显示的是函数cvFindContours从二值图像中检索轮廓之后的图像,

cvFindContours函数会对图像进行修改,因此,应该先对原图像进行备份(本程序没有进行备份)。

cvNamedWindow("1",1);
cvShowImage("1",img);




窗口 2 显示的结果是原图像的外轮廓用红色标记,内轮廓用绿色标记

cvNamedWindow("2",1);
cvShowImage("2",imgcolor);




窗口 3 显示的是提取后的轮廓用白色标记,背景为黑色

cvNamedWindow("3",1);
cvShowImage("3",contoursImage);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: