資源簡介
圖像的輪廓的提取有多種方法,現在我就提供幾種方法。

代碼片段和文件信息
#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
評論
共有 條評論