资源简介

基于opencv,实现了傅里叶描述子的VC++代码,在vs2005下亲测可运行,压缩包中附带有运行效果截图。 如果运行出错的话,注意检查是否添加了opencv附加依赖项,注意在配置属性中将MFC的使用改为在共享DLL中使用MFC。

资源截图

代码片段和文件信息

// FourierDescriptor.cpp : Defines the entry point for the console application.
//

#include “StdAfx.h“
#include “cv.h“
#include “highgui.h“
#include 

void CalcFourierDescriptorCoeff(CvSeq* seq_pts int n_fourierCvSeq* seq_fourier);
void CalcBoundary(CvSeq* seq_fourier int n_PtsCvSeq* seq_pts);

int main(int argc char* argv[])
{
IplImage* color = cvLoadImage(“原始lena图像.bmp“ 1);
IplImage* gray = cvCreateImage(cvGetSize(color) 8 1);
IplImage* show = cvCreateImage(cvGetSize(color) 8 1);
cvZero(show);

cvCvtColor(color gray CV_RGB2GRAY); //转换为灰度图
cvThreshold(gray gray 100 255 CV_THRESH_BINARY_INV);
CvMemStorage * storage = cvCreateMemStorage(0); //用来创建一个内存存储器来存储轮廓
CvSeq* contours;
CvSeq* seq_fourier = cvCreateSeq(CV_SEQ_KIND_GENERIC|CV_32SC2 sizeof(CvContour)sizeof(CvPoint2D32f) storage); //创建一个序列
cvFindContours(gray storage &contours sizeof(CvContour)); //从二值图像中检索轮廓,并返回检测到的轮廓的个数

//cvseq产生一个序列
//  int flags; /* micsellaneous flags */ \
//  int header_size; /* 序列头的大小 */ \
//  struct CvSeq* h_prev; /* 前一个序列 */ \
//  struct CvSeq* h_next; /* 后一个序列 */ \
//  struct CvSeq* v_prev; /* 第二级前一个序列 */ \
// struct CvSeq* v_next; /* 第二级后一个序列 */ \
//  int total; /* 元素的总个数 */ \
//  int elem_size;/* 元素的尺寸 */ \
//  char* block_max;/* 上一块的最大块 */ \
//  char* ptr; /* 当前写指针 */ \
//  int delta_elems; /*序列中快的大小
//   (序列粒度) */ \
//  CvMemStorage* storage; /*序列的存储位置 */ \
//  CvSeqBlock* free_blocks; /* 未分配的块序列 */ \
//  CvSeqBlock* first; /* 指向第一个快序列 */
for(; contours; contours = contours->h_next)
{
cvDrawContours(color contours CV_RGB(25500) CV_RGB(25500) 1 3); //在图像上绘制外部和内部轮廓
CalcFourierDescriptorCoeff(contours 20000 seq_fourier);
CalcBoundary(seq_fourier contours->total contours);

for(int i = 0; i < contours->total; i++)
{
CvPoint* pt=(CvPoint*)cvGetSeqElem(contours i); //读出第i个点
if(pt->x >= 0 && pt->x < show->width && pt->y >= 0 && pt->y < show->height)
{
((uchar*)(show->imageData+pt->y*show->widthStep))[pt->x] = 255;
}
}

for(int i = 0; i < contours->total; i++)
{
CvPoint* pt=(CvPoint*)cvGetSeqElem(contours i);
printf(“%d %d %d\n“ pt->x pt->y i);
}
}

cvNamedWindow(“gray“ 1);
cvShowImage(“gray“color);
cvWaitKey(0);

cvNamedWindow(“reconstructed“ 1);
cvShowImage(“reconstructed“ show);
cvWaitKey(0);
cvReleaseMemStorage(&storage);
cvReleaseImage(&color);
cvReleaseImage(&gray);
cvReleaseImage(&show);
cvDestroyAllWindows();
return 0;
}

void CalcFourierDescriptorCoeff(CvSeq* seq_pts int n_fourierCvSeq* seq_fourier)
{
int count = seq_pts->total; //元素总个数
double *coeff_cos *coeff_sin;
coeff_cos = (double*)malloc(count*sizeof(double));
coeff_sin = (double*)malloc(count*sizeof(double));
int i;
for(i = 0; i < count; i++)
{ //这个循环会构成一个圆(形成一圈坐标点,连接起来就是一个类似圆,count越大越类似)
coeff_sin[i] = sin(2*i*CV_PI/count); //y坐标
coeff_cos[i] = cos(2*i*CV_PI/count); 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2013-10-22 14:09  FFT\
     目录           0  2013-10-22 14:08  FFT\debug\
     文件      118784  2013-10-22 14:10  FFT\debug\FFT.exe
     文件      725672  2013-10-22 14:10  FFT\debug\FFT.ilk
     文件     3697664  2013-10-22 14:10  FFT\debug\FFT.pdb
     目录           0  2013-10-22 14:10  FFT\FFT\
     文件    12479488  2013-10-22 14:10  FFT\FFT.ncb
     文件         874  2013-10-11 10:50  FFT\FFT.sln
     文件       27648  2013-10-22 14:10  FFT\FFT.suo
     目录           0  2013-10-22 14:10  FFT\FFT\Debug\
     文件        6282  2013-10-22 14:10  FFT\FFT\Debug\BuildLog.htm
     文件         660  2013-10-11 15:59  FFT\FFT\Debug\FFT.exe.embed.manifest
     文件         724  2013-10-11 15:59  FFT\FFT\Debug\FFT.exe.embed.manifest.res
     文件         625  2013-10-22 14:10  FFT\FFT\Debug\FFT.exe.intermediate.manifest
     文件      173368  2013-10-22 14:10  FFT\FFT\Debug\FFT.obj
     文件          67  2013-10-22 14:10  FFT\FFT\Debug\mt.dep
     文件     1059840  2013-10-22 14:10  FFT\FFT\Debug\vc80.idb
     文件      593920  2013-10-22 14:10  FFT\FFT\Debug\vc80.pdb
     文件        4873  2013-10-22 14:10  FFT\FFT\FFT.cpp
     文件         618  2013-10-11 10:53  FFT\FFT\FFT.h
     文件        4108  2013-10-11 15:59  FFT\FFT\FFT.vcproj
     文件        1405  2013-10-22 14:10  FFT\FFT\FFT.vcproj.XIAO.Administrator.user
     文件        1202  2013-10-11 16:06  FFT\FFT\StdAfx.h
     文件       66614  2004-06-29 22:59  FFT\FFT\原始lena图像.bmp
     目录           0  2013-10-22 14:11  效果图\
     文件       41001  2013-10-11 16:18  效果图\gray.jpg
     文件       36906  2013-10-11 16:18  效果图\reconstructed.jpg
     文件       66614  2004-06-29 22:59  效果图\原始lena图像.bmp

评论

共有 条评论