• 大小: 1.61MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-11-05
  • 语言: 其他
  • 标签:

资源简介

图像的轮廓的提取有多种方法,现在我就提供几种方法。

资源截图

代码片段和文件信息

#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

评论

共有 条评论