【问题标题】:Using cv::Mat with multi-dimensional FFTW3将 cv::Mat 与多维 FFTW3 一起使用
【发布时间】:2018-02-21 14:17:06
【问题描述】:

无论如何如何使用 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*inputcv::Mat。我想摆脱将数据复制到 data_in 的 for 循环,而只使用 input 中已分配的数据。

【问题讨论】:

  • 你想将数据从cv::Mat复制到float[],对吧?
  • 我想完全避免从cv::Mat复制数据并将它们用作函数的float*

标签: c++ opencv fftw


【解决方案1】:

如果我正确理解您的 sn-p,您希望将数据从 cv::Mat 复制到浮点数组。假设您的 cv::MatCV_32F (浮点数)类型,而不是单独复制每个元素,您可以使用 memcpy 复制整个块:

std::memcpy(data_in, input.data, input.total() * sizeof(float));

或者你可以完全跳过复制,直接使用(float*)input.data

【讨论】:

  • 我在发帖之前尝试使用(float*)input.data,但不幸的是这不起作用。执行计划后它只返回零。我想知道它是否与 cv::Mat 使用步骤访问数据有关?
  • 好的,我发现了问题。如果在创建计划之前对其进行了初始化,FFTW 似乎会删除输入数组中的数据。 FFTW_ESTIMATE 标志似乎有助于解决这个问题。所以现在我可以使用(float*)input.data。感谢您的帮助。 :)
  • @VítKarafiát 那么您最终解决问题的解决方案是什么?
  • @Ja_cpp 我现在正在使用plan_f=fftwf_plan_dft_r2c_2d( height , width , (float*)input.data, fft , FFTW_ESTIMATE );
猜你喜欢
  • 2013-02-21
  • 2014-09-24
  • 2018-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 2014-06-21
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多