资源简介
基于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.em
文件 724 2013-10-11 15:59 FFT\FFT\Debug\FFT.exe.em
文件 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
相关资源
- 人脸识别(opencv_facedetect_v4l2)
- 基于opencv的模板匹配代码
- opencv图片扫描以及校正
- opencv手部轮廓识别以及轨迹识别
- opencv2 3D标定.cpp
- 基于opencv漫水填充算法综合
- opencv激光中心线的提取
- FFT(快速傅里叶变换)C++源程序
- OpenCV Computer Vision Application Programming
- 基于图割的图像分割OpenCV+MFC实现
- 识别魔方颜色
- opencv版俄罗斯方块源码
- VS2013 / MFC + OpenCV 2.4.9实现视频的播放
- 粒子滤波器+目标跟踪的C++实现,VS2
- 张平OpenCV算法精讲基于python和C++教材
- 虹膜识别开源代码OSIRIS4.1基于opencv
- Sift特征点提取与匹配opencv库
- YCbCr、混合高斯以及YCbCg肤色检测模型
- 光流法代码
- OpenCV打开摄像机显示在MFC窗口工程源
- 使用c++读取图像到二维矩阵
- 三维点云的圆柱面拟合
- MFC+OPENCV摄像机标定程序
- 基于特征脸的人脸识别MFC+OpenCV
- opencv图像处理MFC
- OPENCV人脸检测加角点检测并输出坐标
- FillHole.rar
- 道路提取算法 c++ opencv
- PCA代码实现详解
- opencv卡尔曼滤波
评论
共有 条评论