资源简介
图像的轮廓的提取有多种方法,现在我就提供几种方法。
代码片段和文件信息
#include “cv.h“
#include “highgui.h“
#include “cxcore.h“
#include
void main()
{
int i;
int contours_num;//轮廓个数
IplImage * Img = cvLoadImage(“00.bmp“ 0);//读入为灰度图像
IplImage * BinImg = cvCreateImage(cvGetSize(Img) Img->depth 1);//二值图像
cvThreshold(Img BinImg 128 255 CV_THRESH_BINARY);//将灰度图像阀值化为二值图像
IplImage * pContourImg = cvCreateImage(cvGetSize(Img) Img->depth 3);//显示轮廓的图像
cvNamedWindow(“原灰度图像“ 1);
cvShowImage(“原灰度图像“ Img);
cvNamedWindow(“二值图像“ 1);
cvShowImage(“二值图像“ BinImg);
//一次提取所有轮廓并绘图显示
CvMemStorage * storage = cvCreateMemStorage();//创建默认大小的存储器
CvSeq * contours;//存储所有轮廓的序列
contours_num = cvFindContours(BinImg storage &contours);//提取所有轮廓,放在list中
printf(“提取的轮廓个数:%d\n“contours_num);
cvDrawContours(pContourImg contours cvScalarAll(255) cvScalarAll(255) 100);//绘制轮廓,遍历深度为100
//寻找周长最大的轮廓,用矩形围住
double maxArea = cvArcLength(contours);
CvSeq * maxContour = contours;
for(CvSeq* c=contours; c!=NULL; c=c->h_next)
{
double area = cvArcLength(c);
if(area > maxArea)
{
maxArea = area;
maxContour = c;
}
}
CvRect outrect = cvBoundingRect(maxContour);
cvRectangle(pContourImgcvPoint(outrect.xoutrect.y)cvPoint(outrect.x+outrect.width outrect.y+outrect.height)CV_RGB(25500));
cvNamedWindow(“所有轮廓“ 1);
cvShowImage(“所有轮廓“ pContourImg);
cvWaitKey(1000);
//逐点画出最外层轮廓
IplImage * BinImg_out = cvCreateImage(cvGetSize(Img) Img->depth 1);//新二值图像因为cvFindContours()会修改原图像
cvThreshold(Img BinImg_out 128 255 CV_THRESH_BINARY);//将灰度图像阀值化为二值图像
IplImage * pContourImg_out = cvCreateImage(cvGetSize(Img) Img->depth 3);//显示最外层轮廓的图像
CvMemStorage * storage_out = cvCreateMemStorage();//创建默认大小的存储器
CvSeq * contour_out;//存储最外层轮廓的序列
cvFindContours(BinImg_out storage_out &contour_out sizeof(CvContour) CV_RETR_EXTERNAL CV_CHAIN_APPROX_NONE);//提取最外层轮廓
printf(“组成最外层轮廓的点的数目:%d\n“contour_out->total);
CvSeqReader reader;//序列读状态
cvStartReadSeq(contour_out&reader0);//初始化序列读状态
CvPoint pt1;
CvScalar color = CV_RGB(255255255);
cvNamedWindow(“最外层轮廓“ 1);
cvShowImage(“最外层轮廓“ pContourImg_out);
for(i=0; itotal; i++)
{
CV_READ_SEQ_ELEM(pt1reader);
cvCircle(pContourImg_outpt12color);
cvShowImage(“最外层轮廓“ pContourImg_out);
cvWaitKey(1);
//printf(“画第%d个点\n“i);
}
//逐个画出所有轮廓
IplImage * BinImg_all = cvCreateImage(cvGetSize(Img) Img->depth 1);//新二值图像因为cvFindContours()会修改原图像
cvThreshold(Img BinImg_all 128 255 CV_THRESH_BINARY);//将灰度图像阀值化为二值图像
IplImage * pContourImg_all = cvCreateImage(cvGetSize(Img) Img->depth 3);//显示轮廓的图像
CvMemStorage * storage_all = cvCreateMemStorage();//创建默认大小的存储器
CvSeq * first_contour = NULL;//存储第一个轮廓的序列
contours_num = cvFindContours(BinImg_all storage_all &first_contour );//提取所有轮廓,放在list中
printf(“提取的轮廓个数:%d\n“contours_num );
cvNamedWindow(“轮廓“ 1);
i=0;
for(CvSeq* con=first_contour; con!=NULL; con=con->h_next )
{
CvScalar external_color = CV_RGB(ran
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2012-09-01 15:32 lunkuo\
文件 115126 2005-11-21 21:49 lunkuo\00.bmp
目录 0 2012-09-01 15:32 lunkuo\Debug\
文件 164864 2012-09-01 15:47 lunkuo\Debug\vc60.idb
文件 94208 2012-09-01 15:34 lunkuo\Debug\vc60.pdb
文件 196663 2012-09-01 15:34 lunkuo\Debug\轮廓操作.exe
文件 216700 2012-09-01 15:34 lunkuo\Debug\轮廓操作.ilk
文件 22334 2012-09-01 15:34 lunkuo\Debug\轮廓操作.obj
文件 4116956 2012-09-01 15:32 lunkuo\Debug\轮廓操作.pch
文件 484352 2012-09-01 15:34 lunkuo\Debug\轮廓操作.pdb
文件 3670 2012-09-01 15:34 lunkuo\轮廓操作.cpp
文件 3512 2012-09-01 15:49 lunkuo\轮廓操作.dsp
文件 524 2012-09-01 15:49 lunkuo\轮廓操作.dsw
文件 33792 2012-09-01 15:49 lunkuo\轮廓操作.ncb
文件 48640 2012-09-01 15:49 lunkuo\轮廓操作.opt
文件 815 2012-09-01 15:34 lunkuo\轮廓操作.plg
- 上一篇:等值线的提取与识别
- 下一篇:AJax基础教程.pdf
评论
共有 条评论