资源简介
基于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实现摄像头实时显示和视
- Mastering Opencv3英文第二版
- Opencv+MFC框架图像处理
- opencv之数字识别
- grabcut的c++源代码
- 遥感图像拉伸代码
- 车牌识别 openCV mfc BP神经网络
- 基于VC++与OpenCV的圆心坐标提取
- vc下的sift程序
- 傅里叶变换研究|C++源码|带通滤波器
- 用openCV实现图像灰度化并保存,MFC实
- OpenCV多通道图像混合程序 by浅墨
- 经典手眼标定算法C++代码
- OpenCV打开图片和网络摄像头(C++)
- python3.x Opencv Toturial
- 利用MFC和OpenCV实现的图片浏览器,支
- SURF特征点检测 程序 by浅墨
- OpenCV图片翻转(重映射)程序 by浅墨
- OpenCV检测图片中的角点程序 by浅墨
- OpenCV直线检测程序 by浅墨
- OpenCV高级形态学程序 by浅墨
- OpenCV滚动条的创建程序 by浅墨
- OpenCV调整图片对比度&亮度 程序 by浅墨
- 基于OpenCV的步态能量图源代码GEI Gai
- 非线性滤波
- OpencV与MFC综合应用.rar
- 利用opencv 完成camshift+ kalman
- C语言实现图像的文字识别OpenCV+OCR实现
- 基于opencv中AdaBoost的人脸检测
- 基于MFC对话框的OpenCV视频播放(new)
评论
共有 条评论