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);
相关文章推荐
- OpenCV成长之路:直线、轮廓的提取与描述
- OpenCV成长之路(8):直线、轮廓的提取与描述
- opencv轮廓提取、轮廓识别相关要点
- [转]opencv轮廓提取(findcontours函数详解)
- Dlib+opencv实时提取人脸轮廓(windows环境下//Dlib配置入门)
- opencv矩形轮廓提取
- opencv3/C++轮廓的提取与筛选
- python-opencv在有噪音的情况下提取图像的轮廓实例
- matlab使用opencv (轮廓提取+直线拟合)
- 我的OpenCV学习笔记(20):提取元素的轮廓及形状描述子
- OpenCV成长之路:直线、轮廓的提取与描述
- 使用OpenCV的函数findContours提取轮廓并绘制轮廓
- OpenCV成长之路:直线、轮廓的提取与描述
- OpenCV与EmguCV中的图像轮廓提取
- 提取轮廓在OpenCV里有一个函数 cvFindContours
- OpenCV轮廓提取
- OpenCV_提取直线、轮廓和区域
- 使用opencv提取单据轮廓并旋转后生成图片
- OpenCV成长之路:直线、轮廓的提取与描述
- opencv学习笔记12 图像轮廓的提取和绘制