Преобразование Фурье + emgucv

Может ли кто-нибудь сказать мне, в чем проблема в этом коде...

В основном я пытаюсь вычислить dft изображения и показать его как изображение на моем экране.

Image<Gray, float> GreyOriginalImage = new Image<Gray, float>(strFileName);
Matrix<float> imageMat = new Matrix<float>( CvInvoke.cvGetOptimalDFTSize( GreyOriginalImage.Rows ) , CvInvoke.cvGetOptimalDFTSize( GreyOriginalImage.Cols ) );

GreyOriginalImage.CopyTo( imageMat.GetSubRect( GreyOriginalImage.ROI ) );
CvInvoke.cvDFT( imageMat , imageMat , Emgu.CV.CvEnum.CV_DXT.CV_DXT_FORWARD , imageMat.Rows );

GreyFourierImage = new Image<Gray, float>( imageMat.Rows , imageMat.Cols );
imageMat.CopyTo( GreyFourierImage );

ImageBox2.Image = GreyFourierImage;
imageBox2.Show();

Проблема в том, что код зависает во время выполнения, и изображение не отображается....

Я использую Visual Studio 2010 с emgu cv.


person Community    schedule 02.10.2011    source источник


Ответы (1)


Ну, я просмотрел ваш код и отладил его, проблема здесь:

imageMat.CopyTo( GreyFourierImage );

Вы пытаетесь скопировать imageMat, который представляет собой массив с плавающей запятой[,], в изображение с плавающей запятой[,,*]. Я уверен, что вы можете понять, что это просто не не работает и поэтому программа зависает.

Вот код, который разделяет мнимую и действительную части из cvDFT:

Image<Gray, float> image = new Image<Gray, float>(open.FileName);
IntPtr complexImage = CvInvoke.cvCreateImage(image.Size, Emgu.CV.CvEnum.IPL_DEPTH.IPL_DEPTH_32F, 2);

CvInvoke.cvSetZero(complexImage);  // Initialize all elements to Zero
CvInvoke.cvSetImageCOI(complexImage, 1);
CvInvoke.cvCopy(image, complexImage, IntPtr.Zero);
CvInvoke.cvSetImageCOI(complexImage, 0);

Matrix<float> dft = new Matrix<float>(image.Rows, image.Cols, 2);
CvInvoke.cvDFT(complexImage, dft, Emgu.CV.CvEnum.CV_DXT.CV_DXT_FORWARD, 0);

//The Real part of the Fourier Transform
Matrix<float> outReal = new Matrix<float>(image.Size);
//The imaginary part of the Fourier Transform
Matrix<float> outIm = new Matrix<float>(image.Size);
CvInvoke.cvSplit(dft, outReal, outIm, IntPtr.Zero, IntPtr.Zero);

//Show The Data       
CvInvoke.cvShowImage("Real", outReal);
CvInvoke.cvShowImage("Imaginary ", outIm);

Ваше здоровье,

Крис

person Chris    schedule 05.10.2011
comment
Привет, я нашел решение после того, как немного покопался и отредактировал свой ответ выше. - person Chris; 07.10.2011