在Visual Studio 2019 中用C代码调用 opencv 进行 一维数据的傅里叶变换 DFT 和傅里叶逆变换 IDFT(Windows)
最近在用C代码调用opencv进行一维数据的傅里叶变换以及傅里叶逆变换,但是网上的资料比较分散不全面,因此在这里进行一些总结分享。
一、opencv版本选择
在visual studio 2019中用C代码调用opencv需要进行opencv环境的配置,在选择opencv版本时,需要注意该版本下的C API是否可用,与visual studio 2019是否匹配(vc14,vc15)?经过网上信息查询和实验尝试,最终采用opencv 2.4.13版本进行环境搭建(opencv官网上可下载)。
二、配置opencv(Windows)
(可参照:https://blog.csdn.net/guanzhen3657/article/details/81071359)
1. 在Windows 10 中安装opencv
- 从官网上下载opencv 的windows版本;
- 双击文件将opencv解压到安装路径;
- 配置系统环境变量:高级系统设置>>高级>>环境变量,编辑path,添加“xxxxxx\build\x64\vc14\bin”(xxxxxx为opencv安装路径)。
2. 在visual studio 2019中配置opencv
- 打开 visual studio 2019,新建项目,右键点击属性进行编辑;
- 在 VC++ 目录—>包含目录 中添加
xxxxxxx\opencv\build\include
xxxxxxx\opencv\build\include\opencv
xxxxxxx\opencv\build\include\opencv2
- 在 VC++ 目录—>库目录 中添加:
xxxxxxx\opencv\build\x64\vc14\lib
- 在 链接器—>输入—>附加依赖库 中添加:
(根据具体需求添加)
opencv_calib3d2413d.lib
opencv_contrib2413d.lib
opencv_core2413d.lib
opencv_features2d2413d.lib
opencv_flann2413d.lib
opencv_gpu2413d.lib
opencv_highgui2413d.lib
opencv_imgproc2413d.lib
opencv_legacy2413d.lib
opencv_ml2413d.lib
opencv_nonfree2413d.lib
opencv_objdetect2413d.lib
opencv_ocl2413d.lib
opencv_photo2413d.lib
opencv_stitching2413d.lib
opencv_superres2413d.lib
opencv_ts2413d.lib
opencv_video2413d.lib
opencv_videostab2413d.lib
3. 测试opencv是否配置成功
- 创建.c文件;
- 输入以下内容:
#include"opencv2/core/core_c.h"
#include"cv.h"
#include "highgui.h"
int main()
{
IplImage* img = cvLoadImage("1.jpg",1);
cvShowImage("Example1", img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("Example1");
return 0;
}
- 若窗口显示“1.jpg”的图像则说明配置成功。
三、C代码调用 opencv 的 cvDFT进行傅里叶变换和傅里叶逆变换
1. CvMat的初始化和赋值
因为使用opencv的cvDFT需要用到CvMat结构,因此下面会对CvMat的使用进行简单的描述。
(1)方法一:
double a[4] = {
1.1, 2.2,3.3, 4.4 };//数组
CvMat mat = cvMat(1, 4, CV_64F, a);//将cvMat的数值初始化为数组a的数值
double* data = mat.data.db;//data为数据指针
printf("%.4f",data[0]);//输出mat中的第一个数值
注意: db是double,fl是float,i是int, 具体使用哪一种与CvMat的数值类型有关(根据数据需求选择CV_64F等其他数据类型),CvMat 的结构可以在 opencv 的 types_c.h 文件中查看;在查看mat数据或对mat进行赋值时,可以用 data[x] 来对下标为x的数值进行操作。
(2)方法二:
double a[4] = {
1.1, 2.2,3.3, 4.4 };
CvMat* mat = cvCreateMat(1, 4, CV_64F);//定义
cvZero(mat);//初始化为0
double* data = mat->data.db;//指针
for (int i = 0; i < 4; i++)data[i] = a[i];//赋值
2. 傅里叶变换(DFT)
(1)进行傅里叶变换
int