Vb.net Emgu 3.0和x2B中图像的DFT;
如何在visual basic中使用Emgu 3.0+计算图像的DFT 我用CvInvoke.Imread()加载了一些图像作为Mat,我可以显示和更改它们,我想计算这个图像的正向DFT,然后显示大小。我该怎么做?我无法将有效的IInputarray输入到CvInvoke.Dft()。目前我的Emgu版本是3.1.0 以下是我当前使用的代码:Vb.net Emgu 3.0和x2B中图像的DFT;,vb.net,visual-studio,opencv,emgucv,dft,Vb.net,Visual Studio,Opencv,Emgucv,Dft,如何在visual basic中使用Emgu 3.0+计算图像的DFT 我用CvInvoke.Imread()加载了一些图像作为Mat,我可以显示和更改它们,我想计算这个图像的正向DFT,然后显示大小。我该怎么做?我无法将有效的IInputarray输入到CvInvoke.Dft()。目前我的Emgu版本是3.1.0 以下是我当前使用的代码: Dim imgOrig As Mat imgOrig = CvInvoke.Imread(ofd.FileName, LoadImageT
Dim imgOrig As Mat
imgOrig = CvInvoke.Imread(ofd.FileName, LoadImageType.AnyColor)
EmguImageBox.Image = imgOrig
Dim imgGrayscale As New Mat()
CvInvoke.CvtColor(imgOrig, imgGrayscale, ColorConversion.Bgr2Gray)
EmguImageBox.Image = imgGrayscale
Dim imgDFT As Mat
imgDFT = New Mat(imgOrig.Rows, imgOrig.Cols, DepthType.Cv32F, 2)
CvInvoke.Dft(imgGrayscale, imgDFT, DxtType.Forward, 0)
EmguImageBox.Image = imgDFT
也许你已经解决了这个问题,但这里的一些信息可能会让其他人也有同样的问题。我自己也曾尝试在Emgu版本3.1.0中进行同样的操作,但只找到使用旧版本Emgu的示例。终于有了工作,也许你能在VB中实现同样的功能
#region Perform FFT
//Get optimal DFT size
int m = CvInvoke.GetOptimalDFTSize(originalImg.Height);
int n = CvInvoke.GetOptimalDFTSize(originalImg.Width);
//Resize image
Mat resizedImg = new Mat();
CvInvoke.CopyMakeBorder(originalImg, resizedImg, 0, m - originalImg.Height, 0, n - originalImg.Width, Emgu.CV.CvEnum.BorderType.Default);
//Create imaginary channel for original image
Mat imChannel = new Mat(resizedImg.Size, Emgu.CV.CvEnum.DepthType.Cv32F, 1);
imChannel.SetTo(new MCvScalar(0));
//Add both real and imaginary channel to Mat vector
Emgu.CV.Util.VectorOfMat vectorMat = new Emgu.CV.Util.VectorOfMat(new Mat[2] { resizedImg, imChannel });
//Create 2 channel Mat from the vector
Mat FFTimg = new Mat(resizedImg.Size, Emgu.CV.CvEnum.DepthType.Cv32F, 2);
CvInvoke.Merge(vectorMat, FFTimg);
//Perform DFT
CvInvoke.Dft(FFTimg, FFTimg, Emgu.CV.CvEnum.DxtType.Forward, 0);
//Split channels to separate Mat objects
CvInvoke.Split(FFTimg, vectorMat);
//Calculate magnitudes
Mat fftMag = new Mat();
CvInvoke.Pow(vectorMat[0], 2, vectorMat[0]);
CvInvoke.Pow(vectorMat[1], 2, vectorMat[1]);
CvInvoke.Add(vectorMat[0], vectorMat[1], fftMag);
CvInvoke.Sqrt(fftMag, fftMag);
//Swith quadrants
Mat q1 = new Mat(fftMag, new System.Drawing.Rectangle(0, (int)(fftMag.Height - fftMag.Height / 2), (int)(fftMag.Width / 4), fftMag.Height - (int)(fftMag.Height - fftMag.Height / 2)));
Mat q2 = new Mat(fftMag, new System.Drawing.Rectangle(0, 0, (int)(fftMag.Width / 4), (int)(fftMag.Height / 2)));
Mat tmp = new Mat();
q1.CopyTo(tmp);
q2.CopyTo(q1);
tmp.CopyTo(q2);
#endregion
也许你已经解决了这个问题,但这里的一些信息可能会让其他人也有同样的问题。我自己也曾尝试在Emgu版本3.1.0中进行同样的操作,但只找到使用旧版本Emgu的示例。终于有了工作,也许你能在VB中实现同样的功能
#region Perform FFT
//Get optimal DFT size
int m = CvInvoke.GetOptimalDFTSize(originalImg.Height);
int n = CvInvoke.GetOptimalDFTSize(originalImg.Width);
//Resize image
Mat resizedImg = new Mat();
CvInvoke.CopyMakeBorder(originalImg, resizedImg, 0, m - originalImg.Height, 0, n - originalImg.Width, Emgu.CV.CvEnum.BorderType.Default);
//Create imaginary channel for original image
Mat imChannel = new Mat(resizedImg.Size, Emgu.CV.CvEnum.DepthType.Cv32F, 1);
imChannel.SetTo(new MCvScalar(0));
//Add both real and imaginary channel to Mat vector
Emgu.CV.Util.VectorOfMat vectorMat = new Emgu.CV.Util.VectorOfMat(new Mat[2] { resizedImg, imChannel });
//Create 2 channel Mat from the vector
Mat FFTimg = new Mat(resizedImg.Size, Emgu.CV.CvEnum.DepthType.Cv32F, 2);
CvInvoke.Merge(vectorMat, FFTimg);
//Perform DFT
CvInvoke.Dft(FFTimg, FFTimg, Emgu.CV.CvEnum.DxtType.Forward, 0);
//Split channels to separate Mat objects
CvInvoke.Split(FFTimg, vectorMat);
//Calculate magnitudes
Mat fftMag = new Mat();
CvInvoke.Pow(vectorMat[0], 2, vectorMat[0]);
CvInvoke.Pow(vectorMat[1], 2, vectorMat[1]);
CvInvoke.Add(vectorMat[0], vectorMat[1], fftMag);
CvInvoke.Sqrt(fftMag, fftMag);
//Swith quadrants
Mat q1 = new Mat(fftMag, new System.Drawing.Rectangle(0, (int)(fftMag.Height - fftMag.Height / 2), (int)(fftMag.Width / 4), fftMag.Height - (int)(fftMag.Height - fftMag.Height / 2)));
Mat q2 = new Mat(fftMag, new System.Drawing.Rectangle(0, 0, (int)(fftMag.Width / 4), (int)(fftMag.Height / 2)));
Mat tmp = new Mat();
q1.CopyTo(tmp);
q2.CopyTo(q1);
tmp.CopyTo(q2);
#endregion
你能把你已经尝试过的代码包括进来吗?我一般都是按照这个家伙的方法来做的,但是错误正在出现。我将添加一些我一直在尝试的代码。你能包括你已经尝试过的代码吗?我通常一直在尝试按照这家伙的方法:,但错误正在出现。我将添加一些我一直在尝试的代码。