2011-10-02 3 views
2

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

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

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 резюме.

ответ

4

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

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); 

Cheers,

Chris

+0

Привет Я нашел решение после немного копать и редактировать aswer выше Приветствий – Chris

Смежные вопросы