带有qt的FFTW C++程序崩溃

FFTW with qt C++ program crash

本文关键字:程序 崩溃 C++ FFTW qt 带有      更新时间:2023-10-16

我尝试从具有fftw和qt的图像列表中计算时间像素向量的fft,并对所有图像的所有像素重复此过程;该向量包含[im1的pix1.1,im2的pix1.1,...imN的pix1.1],问题是当图像数量很大时程序崩溃

const int Npoints(widget.imagelistWidget->count());
fftw_complex *in, *out;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Npoints);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)*Npoints);
double  resfft;
fftw_plan p;
QList<QImage*> imageList;
QImage *imagef ;
for(int k=0;k<liste.size();k++)
{
    imagef = new QImage;
    imagef->load(liste[k]);
    imageList.append(imagef);
}
for(int i=0;i<imagef->width();i++)
{
    for(int j=0;j<imagef->height();j++)
    {
        for(int k=0;k<liste.size();k++)
        {
             imagef  =imageList.at(k);
             QRgb pixelfft=imagef->pixel(i,j);
             double  moyp= qGray(pixelfft);
             in[k][0] = moyp;
             in[k][1] = 0.0;
        }
        p = fftw_plan_dft_1d(Npoints, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
        fftw_execute(p);
        //resultat
        QVector<qreal> realV;
        QVector<qreal> imgV;
        for (int s = 0; s < Npoints; s++) 
        {
            realV.append(out[s][0]);
            imgV.append(out[s][1]);
        }
        for(int l=0;l<liste.size();++l)
        { 
            resfft = sqrt((realV[l] * realV[l]) + (imgV[l] * imgV[l]));
            imagef=imageList.at(l);
            imagef->setPixel(i,j,qGray(qRgb(resfft,resfft,resfft)));
        }
    }
}    

我认为这就是@bibi的评论所要表达的,但这部分看起来是错误的:

for(int i=0;i<imagef->width();i++)
{
for(int j=0;j<imagef->height();j++)
{
    for(int k=0;k<liste.size();k++)
    {
     imagef  =imageList.at(k);
     QRgb pixelfft=imagef->pixel(i,j);
     double  moyp= qGray(pixelfft);
     in[k][0] = moyp;
     in[k][1] = 0.0;
    } 

您的循环似乎顺序错误。 当您调用 widthheight 时,您不会在内部循环中的当前映像上调用它们。 你可能想要的是这个:

for(int k=0;k<liste.size();k++)
{
    //Get the current image from the list
    imagef  = imageList.at(k);
    //Loop over every pixel in the image
    for(int i=0;i<imagef->width();i++)
    {
        for(int j=0;j<imagef->height();j++)
        {
            QRgb pixelfft=imagef->pixel(i,j);
            double  moyp= qGray(pixelfft);
            in[k][0] = moyp;
            in[k][1] = 0.0;
        } 
    }
    /*...*/