这个问题我已经看过了 fftshift/ifftshift C/C++ source code
我正在尝试从 matlab 实现fftshift
这是一维数组来自matlab函数的代码
numDims = ndims(x);
idx = cell(1, numDims);
for k = 1:numDims
m = size(x, k);
p = ceil(m/2);
idx{k} = [p+1:m 1:p];
end
y = x(idx{:});
我的 c++/openCV 代码是,fftshift 基本上做的是从某个枢轴位置交换值。
因为我似乎无法理解 opencv 中如何为复数构建矩阵。
它在这里说
http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#dft
CCS(复共轭对称
我认为将复数拆分为实数和虚数并交换它们会更容易。然后合并回一个矩阵。
cv::vector<float> distanceF (f.size());
//ff = fftshift(ff);
cv::Mat ff;
cv::dft(distanceF, ff, cv::DFT_COMPLEX_OUTPUT);
//Make place for both the complex and the real values
cv::Mat planes[] = {cv::Mat::zeros(distanceF.size(),1, CV_32F), cv::Mat::zeros(distanceF.size(),1, CV_32F)};
cv::split(ff, planes); // planes[0] = Re(DFT(I), planes[1] = Im(DFT(I))
int numDims = ff.dims;
for (int i = 0; i < numDims; i++)
{
int m = ff.rows;
int p = ceil(m/2);
}
我的问题是因为我对 DFT 的输入是 vector<float>
我似乎无法创建平面垫来拆分复数?
你能想到一种更好的方法来交换 cv::mat 数据结构中的值吗?
最佳答案
好吧,这个线程可能已经过时了,但也许对其他用户来说。看看示例:
opencv/samples/cpp/dft.cpp (line 66 - 80)
int cx = mag.cols/2;
int cy = mag.rows/2;
// rearrange the quadrants of Fourier image
// so that the origin is at the image center
Mat tmp;
Mat q0(mag, Rect(0, 0, cx, cy));
Mat q1(mag, Rect(cx, 0, cx, cy));
Mat q2(mag, Rect(0, cy, cx, cy));
Mat q3(mag, Rect(cx, cy, cx, cy));
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);
q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);
我认为这是针对不同维度的一种简短而干净的方法。
关于c++ - openCV 的 fftshift C++ 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29226465/