2012-09-18 5 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