2011-10-07 157 views

回答

2

从我的回答Fourier Transform + emgucv

功能你后CvInvoke.cvDFT它在技术上调用OpenCV的方法,但它应该是你的后

下面是代码从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); 

干杯,

克里斯

+0

对于使用的正是这种代码的某些原因,它挂在CvInvoke.cvCopy – a432511

+0

嗨,您正在使用什么版本EMGU的。请确保图像和complexImage大小相同(包括ROI),否则该方法将冻结。欢呼 – Chris

+0

问题在于频道数量。谢谢! – a432511