Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FFTW和OpenCV';s C++;接口,Mat输出中的实部和虚部 我试图用FFTW 3.3和OpenCV 2.1用C++接口编写FFT/IFFT函数。我见过很多使用旧OpenCV格式的例子,我做了直接转换,但有些东西不起作用_C++_Opencv_Fftw - Fatal编程技术网

FFTW和OpenCV';s C++;接口,Mat输出中的实部和虚部 我试图用FFTW 3.3和OpenCV 2.1用C++接口编写FFT/IFFT函数。我见过很多使用旧OpenCV格式的例子,我做了直接转换,但有些东西不起作用

FFTW和OpenCV';s C++;接口,Mat输出中的实部和虚部 我试图用FFTW 3.3和OpenCV 2.1用C++接口编写FFT/IFFT函数。我见过很多使用旧OpenCV格式的例子,我做了直接转换,但有些东西不起作用,c++,opencv,fftw,C++,Opencv,Fftw,我的函数的目标是返回一个Mat对象,其中包含FFT的实部和虚部,就像dft默认的OpenCV函数一样。下面是函数的代码。在将im_数据复制到data_in的行中,程序因内存问题而被阻止 有人知道我做错了什么吗?多谢各位 Mat fft_sr(Mat& I) { double *im_data; double *realP_data; double *imP_data; fftw_complex *data_in; fftw_

我的函数的目标是返回一个Mat对象,其中包含FFT的实部和虚部,就像dft默认的OpenCV函数一样。下面是函数的代码。在将im_数据复制到data_in的行中,程序因内存问题而被阻止

有人知道我做错了什么吗?多谢各位

Mat fft_sr(Mat& I)
{

double          *im_data;
double          *realP_data;
double          *imP_data;

fftw_complex    *data_in;
fftw_complex    *fft;      

fftw_plan       plan_f;

int width     = I.cols;
int height    = I.rows;
int step      = I.step;

int             i, j, k;

Mat realP=Mat::zeros(height,width,CV_64F); // Real Part FFT
Mat imP=Mat::zeros(height,width,CV_64F); // Imaginary Part FFT


im_data = ( double* ) I.data;
realP_data = ( double* ) realP.data;
imP_data = ( double* ) imP.data;


data_in = ( fftw_complex* )fftw_malloc( sizeof( fftw_complex ) * width * height );
fft     = ( fftw_complex* )fftw_malloc( sizeof( fftw_complex ) * width * height );

// Problem Here
for( i = 0, k = 0 ; i < height ; i++ ) {
    for( j = 0 ; j < width ; j++ ) {
        data_in[k][0] = ( double )im_data[i * step + j];
        data_in[k][1] = ( double )0.0;
        k++;
    }
}


plan_f = fftw_plan_dft_2d( height, width, data_in, fft,  FFTW_FORWARD,  FFTW_ESTIMATE );


fftw_execute( plan_f );

// Copy real and imaginary data
for( i = 0, k = 0 ; i < height ; i++ ) {
    for( j = 0 ; j < width ; j++ ) {
        realP_data[i * step + j] = ( double )fft[k][0];
        imP_data[i * step + j] = ( double )fft[k][1];
        k++;

    }
}



Mat fft_I(I.size(),CV_64FC2);
Mat fftplanes[] = {Mat_<double>(realP), Mat_<double>(imP)};
merge(fftplanes, 2, fft_I);

fftw_destroy_plan(plan_f);
fftw_free(data_in);
fftw_free(fft);
return fft_I;   
}
Mat fft\u sr(Mat&I)
{
双*im_数据;
双*realP_数据;
双*imP_数据;
fftw_复合体*数据_in;
fftw_复数*fft;
fftw计划;
int width=I.cols;
int高度=I行;
int-step=I.step;
int i,j,k;
Mat realP=Mat::zeros(高度、宽度、CV_64F);//实部FFT
Mat imP=Mat::零(高度、宽度、CV_64F);//虚部FFT
im_数据=(双*)I.数据;
realP_data=(双*)realP.data;
imP_数据=(双*)imP.data;
数据输入=(fftw\u复合体*)fftw\u malloc(sizeof(fftw\u复合体)*宽度*高度);
fft=(fftw_复合体*)fftw_malloc(sizeof(fftw_复合体)*宽度*高度);
//这里有问题
对于(i=0,k=0;i
您使用的
步骤
错误。它旨在索引到
Mat::data
。由于在分配给
im\u data
时,您已经将
Mat::data
强制转换为
double*
,因此您可以“正常”索引到
im\u data中:

使用
步骤时
索引的正确方法是:

data_in[k][0] = ( double )I.data[i * step + j];

更新:

尝试按行访问图像。这样,您就可以避免遇到步幅/步幅方面的问题,同时仍然可以利用快速访问:

for (int i = 0; i < I.rows; i++)
{
    double* row = I.ptr<double>(i);

    for (int j = 0; j < I.cols; j++)
    {
        // Do something with the current pixel.
        double someValue = row[j];
    }
}
for(int i=0;i
我知道这很旧,但当您使用fftw时,您需要在
只有在为fft创建了计划之后,如果我没有记错的话,当您创建计划时,它会设置所有
*将
中的数据值设置为0。
所以在计划之前分配,在计划之后初始化

步骤
设置为什么?“这里的问题”到底是什么意思?当您添加行
std:cout步骤固定为4096(8字节(CV_64F,64位浮点)*512(行大小))时会发生什么,它们是512x512图像。添加这一行,它会在i=64,j=506处抛出一个“访问冲突读取位置0x04331000”。不幸的是,在对它进行多次测试后,它无法工作。昨天,我更改了你建议的行(两种方式),我没有出现内存错误,我认为结果是可以的。在不同的场景下测试后,它不能正常工作(在fft/ifft函数中的同一行或类似内存访问行中得到相同的错误)。如果没有内存错误,函数就不能正确返回图像的FFT。@aristos我想你在其他地方仍然做了一些索引错误。您直接访问
Mat::data
有什么原因吗?为什么不先使用
Mat::at()
,以便更安全地访问内存并在以后提高性能?无论如何,在我提供更多帮助之前,您必须更新问题中的代码,并描述发生错误的确切位置。
Mat::at()
比直接访问
Mat::data
慢,不是吗?嗯,我试过了,而且花了很多时间,这就是我为什么要找的原因alternatives@aristos我用新的建议更新了我的答案。请将你的问题重新整理成一个最小但完整的例子,以防这样做无济于事。
for (int i = 0; i < I.rows; i++)
{
    double* row = I.ptr<double>(i);

    for (int j = 0; j < I.cols; j++)
    {
        // Do something with the current pixel.
        double someValue = row[j];
    }
}