EmguCV 3.4.1中的傅立叶变换

时间:2018-06-24 00:51:37

标签: c# emgucv

以下代码在EmguCV 3.4.1中无法编译。

        Image<Gray, float> image = new Image<Gray, float>(path);
        IntPtr complexImage = CvInvoke.cvCreateImage(image.Size, 
Emgu.CV.CvEnum.IplDepth.IplDepth32F, 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.DxtType.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);

某些功能

cvSetZero()
cvDFT()
cvShowImage()

在此版本的EmguCV中不可用。

如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

从3.0版开始,EmguCV更适用于Mat而非Image。还将某些方法从CvInvoke移至Mat或Image或重命名了(例如:CvInvoke.cvShowImage-> CvInvoke.Imshow)。

我在dft上也遇到了这个问题,并尝试将代码从openCV example移植到c#。这就是我的工作方式(使用EmguCV 3.4.1):

    var image = new Mat(path, ImreadModes.Grayscale);

    int a = CvInvoke.GetOptimalDFTSize(image.Rows);
    int b = CvInvoke.GetOptimalDFTSize(image.Cols);

    var extended = new Mat();
    CvInvoke.CopyMakeBorder(image, extended, 0, a - image.Rows, 0, b - image.Cols, BorderType.Constant, new MCvScalar(0));

    extended.ConvertTo(extended, DepthType.Cv32F);
    var vec = new VectorOfMat(extended, new Mat(extended.Size, DepthType.Cv32F, 1));
    var complex = new Mat();
    CvInvoke.Merge(vec, complex);

    CvInvoke.Dft(complex, complex, DxtType.Forward, 0);

    CvInvoke.Split(complex, vec);

    vec[0].ConvertTo(vec[0], DepthType.Cv8U);
    vec[1].ConvertTo(vec[1], DepthType.Cv8U);

    CvInvoke.Imshow("Real", vec[0]);
    CvInvoke.Imshow("Img", vec[1]);

答案 1 :(得分:2)

某些方法已被重命名或移动。将CvInvoke.DftImage.toUMatUMat结合使用进行图像处理。 ImageViewer可用于显示图像。

Image<Gray, float> image = new Image<Gray, float>(path);
UMat dftImage = new UMat(image.Size, Emgu.CV.CvEnum.DepthType.Cv32F, 2);
CvInvoke.Dft(image, dftImage, Emgu.CV.CvEnum.DxtType.Forward, image.Rows);