使用 cv::Mat 与多维 FFTW3
Using cv::Mat with multi-dimensional FFTW3
无论如何,如何使用 FFTW3 中的 fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1,double *in, fftw_complex *out, unsigned flags)
函数并将输入作为来自 cv::Mat 对象的数据?我当前的工作代码如下所示:
data_in = fftwf_alloc_real(width * height);
fft = fftwf_alloc_complex((width/2+1) * height);
plan_f=fftwf_plan_dft_r2c_2d( height , width , data_in, fft , FFTW_MEASURE );
// Prepare input data
for(int i = 0,k=0; i < height; ++i) {
const float* row = input.ptr<float>(i);
for(int j = 0; j < width; j++) {
data_in[k]=(float)row[j];
k++;
}
}
// Exectue fft
fftwf_execute( plan_f );
其中data_in是数组类型float*
,input是cv::Mat
。我想摆脱将数据复制到 data_in 的循环,只使用来自 input 的已分配数据。
如果我对您的代码段的理解正确,您想要将数据从 cv::Mat
复制到浮点数组。假设您的 cv::Mat
是 CV_32F
(浮点数)类型,而不是单独复制每个元素,您可以使用 memcpy
:
复制整个块
std::memcpy(data_in, input.data, input.total() * sizeof(float));
或者您可以完全跳过复制,只使用 (float*)input.data
无论如何,如何使用 FFTW3 中的 fftw_plan fftw_plan_dft_r2c_2d(int n0, int n1,double *in, fftw_complex *out, unsigned flags)
函数并将输入作为来自 cv::Mat 对象的数据?我当前的工作代码如下所示:
data_in = fftwf_alloc_real(width * height);
fft = fftwf_alloc_complex((width/2+1) * height);
plan_f=fftwf_plan_dft_r2c_2d( height , width , data_in, fft , FFTW_MEASURE );
// Prepare input data
for(int i = 0,k=0; i < height; ++i) {
const float* row = input.ptr<float>(i);
for(int j = 0; j < width; j++) {
data_in[k]=(float)row[j];
k++;
}
}
// Exectue fft
fftwf_execute( plan_f );
其中data_in是数组类型float*
,input是cv::Mat
。我想摆脱将数据复制到 data_in 的循环,只使用来自 input 的已分配数据。
如果我对您的代码段的理解正确,您想要将数据从 cv::Mat
复制到浮点数组。假设您的 cv::Mat
是 CV_32F
(浮点数)类型,而不是单独复制每个元素,您可以使用 memcpy
:
std::memcpy(data_in, input.data, input.total() * sizeof(float));
或者您可以完全跳过复制,只使用 (float*)input.data