【问题标题】:Fourier Transform in EmguCV 3.4.1EmguCV 3.4.1 中的傅立叶变换
【发布时间】:2018-11-07 08:48:44
【问题描述】:

以下代码无法在 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 中不可用。

我该如何解决这个问题?

【问题讨论】:

    标签: c# emgucv


    【解决方案1】:

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

    【讨论】:

    • 什么是VectorOfMat
    • VectorOfMat 是 EmguCV 提供的用于保存多个 Mat 对象的数据结构。一些 EmguCV 方法需要多个 Mat 对象作为输入或输出。在这种情况下使用 VectorOfMat
    • 您是否将其与您发布的原始样本的输出进行了比较?使用 EmguCV 版本
    • 这是莉娜的照片。你知道它应该是什么样子。
    【解决方案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);
    

    【讨论】:

    • /*Show The Data */ Image&lt;Bgr, byte&gt; im2 = dftImage.ToImage&lt;Bgr, byte&gt;(); pictureBox1.Image = im2.ToBitmap(); ........这段代码正在生成异常。
    • 有什么异常?这是ImageBox (emgu.com/wiki/files/3.4.1/document/html/…)
    • An unhandled exception of type 'System.Exception' occurred in Emgu.CV.World.dll Additional information: Unsupported conversion
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多