2012-09-18 95 views
0

我試圖使用EmguCV檢測圖像的模糊。現在我試圖做一個灰色圖像的FFT,但我被卡住了,因爲我的程序在調用CvInvoke.cvCopy後掛起。見下:EmguCV檢測圖像模糊

_capturedFrames.ForEach(x => 
{ 
    using(var gray = x.Convert<Gray, float>()) 
    { 
     IntPtr complexImage = CvInvoke.cvCreateImage(gray.Size, IPL_DEPTH.IPL_DEPTH_32F, 2); 

     CvInvoke.cvSetZero(complexImage); // Initialize all elements to Zero 
     CvInvoke.cvSetImageCOI(complexImage, 1); 
     CvInvoke.cvCopy(gray.Ptr, complexImage, IntPtr.Zero); 
     CvInvoke.cvSetImageCOI(complexImage, 0); 

     var dft = new Matrix<float>(gray.Rows, gray.Cols, 2); 
     CvInvoke.cvDFT(complexImage, dft, CV_DXT.CV_DXT_FORWARD, 0); 

     double min; 
     double max; 
     Point minLoc; 
     Point maxLoc; 
     dft.MinMax(out min, out max, out minLoc, out maxLoc); 

     if (max > overallMax) 
     { 
      overallMax = max; 
      index = _capturedFrames.IndexOf(x); 
     } 

     CvInvoke.cvReleaseImage(ref complexImage); 
    } 
}); 

上面的代碼的目的是循環瀏覽內存中的圖像集合,並找到最清晰的圖像的索引。讓我們假裝上面的方法正在工作......這是一個檢測最清晰圖像的強大方法嗎? FFT是否可靠用於此目的?

回答

0

你們都知道了。請參閱下面更正的代碼。請注意gray.NumberOfChannels屬性。

_capturedFrames.ForEach(x => 
{ 
    using(var gray = x.Convert<Gray, float>()) 
    { 
     IntPtr complexImage = CvInvoke.cvCreateImage(gray.Size, IPL_DEPTH.IPL_DEPTH_32F, gray.NumberOfChannels); 

     CvInvoke.cvSetZero(complexImage); // Initialize all elements to Zero 
     //CvInvoke.cvSetImageCOI(complexImage, 1); 
     CvInvoke.cvCopy(gray.Ptr, complexImage, IntPtr.Zero); 
     //CvInvoke.cvSetImageCOI(complexImage, 0); 

     var dft = new Matrix<float>(gray.Rows, gray.Cols, gray.NumberOfChannels); 
     CvInvoke.cvDFT(complexImage, dft, CV_DXT.CV_DXT_FORWARD, 0); 

     double min; 
     double max; 
     Point minLoc; 
     Point maxLoc; 
     dft.MinMax(out min, out max, out minLoc, out maxLoc); 

     if (max > overallMax) 
     { 
      overallMax = max; 
      index = _capturedFrames.IndexOf(x); 
     } 

     CvInvoke.cvReleaseImage(ref complexImage); 
    } 
}); 
+0

我應該注意到,這真的只解決了運行時問題,但不是這是否是可靠的方法的問題。 – a432511