C++ OpenCV idft()和MATLAB ifft2的结果不匹配

C++ OpenCV idft()和MATLAB ifft2的结果不匹配,c++,matlab,opencv,C++,Matlab,Opencv,所以我在MATLAB中测试我的算法,它已经完成了 然后用C++实现OpenC+2.4.5. 问题是OpenCV和MATLAB两个平台的傅里叶逆变换方法 所以我用简单矩阵进行了测试 这是测试结果 主题矩阵是。。。3乘3 2-D 1 2 3 4 5 6 7 8 9 -MATLAB- test = [ 1, 2, 3; 4, 5, 6; 7, 8, 9]; Mat input = Mat::zeros(3, 3, CV_64FC2); Mat

所以我在MATLAB中测试我的算法,它已经完成了

然后用C++实现OpenC+2.4.5. 问题是OpenCV和MATLAB两个平台的傅里叶逆变换方法

所以我用简单矩阵进行了测试

这是测试结果

主题矩阵是。。。3乘3 2-D

   1 2 3
   4 5 6
   7 8 9
-MATLAB-

test = [ 1, 2, 3;
         4, 5, 6;
         7, 8, 9];
Mat input = Mat::zeros(3, 3, CV_64FC2); 
Mat output = Mat::zeros(3, 3, CV_64FC2);
idft(input, output, DFT_COMPLEX_OUTPUT+DFT_SCALE, 0);
ifft2(测试)

结果

-OPENCV-

注意:元素是相同的值

Mat a = Mat::zeros(3, 3, CV_64FC1);
Mat b = Mat::zeros(3, 3, CV_64FC1);

 a.at<double>(0,0) = 1;
 a.at<double>(0,1) = 2;
 a.at<double>(0,2) = 3;

 a.at<double>(1,0) = 4;
 a.at<double>(1,1) = 5;
 a.at<double>(1,2) = 6;

 a.at<double>(2,0) = 7;
 a.at<double>(2,1) = 8;
 a.at<double>(2,2) = 9;

 idft(a, b, DFT_SCALE, 0);
我仍然没有找到解决办法。甚至不能给我一个解决方案

编辑:问题已经解决了。我将CV_64FC1作为输入放入idft(),将CV_64FC2作为输出。两个矩阵必须具有相同的深度,输入和输出必须为64_FC2。并且标志DFT+复数输出+DFT\U比例与MATLAB的ifft2相同

-已解决-

test = [ 1, 2, 3;
         4, 5, 6;
         7, 8, 9];
Mat input = Mat::zeros(3, 3, CV_64FC2); 
Mat output = Mat::zeros(3, 3, CV_64FC2);
idft(input, output, DFT_COMPLEX_OUTPUT+DFT_SCALE, 0);

我认为您需要
cv::DFT_复数_输出+cv::DFT_比例
,因为
idft
的输入显然会产生复数矩阵


此外,我认为输出需要一个2通道阵列(键入
CV_64FC2
),输入也是如此。与任何情况一样,您可以访问具有适当矢量类型的元素(例如,对于双精度,
.at(i,j)
,其中
Vec2d
将实部和虚部存储在位置
i,j
)。

我认为如果使用双通道输入矩阵(CV_64FC2),您应该使用

a.at<Vec2d>(0,0)[0] = 1; // Re - part
a.at<Vec2d>(0,0)[1] = 0; // Im - part
a.at(0,0)[0]=1;//再分
a、 at(0,0)[1]=0;//即时通讯
而不是:

a.at<double>(0,0) = 1;
a.at(0,0)=1;

我刚刚试着听你的回答。这是我得到的。我应用了idft(a、b、DFT\u复数输出+DFT\u标度);b是CV_64F2。在idft 3x3 b转换为2x2矩阵后。b[0]4.333332.79743-2.10313-2.83518,b[1]-4.13077-2.10313-0.103134-0.563533。我还是很困惑@user3502592我想你实际上是做了
CV_64FC2
而不是
CV_64F2
?是的,我实际上只是在这里输入了CV_64FC2。