2013-04-14 4 views
2

AForge.NET-Library를 사용하여 Microsoft Kinect로 주사위를 추적하려는 프로젝트에서 작업하고 있습니다. 프로젝트 자체에는 Kinect 초기화, Colorframe 획득 및 하나의 컬러 필터 적용과 같은 기본 사항 만 포함되어 있지만 이미 문제가 발생합니다. 그래서 여기 프로그램의 주요 부분이다 :Kinect 및 AForge로 이미지 처리

colorFrameManager' - 오브젝트 '의 Update'-방법은'다음과 같습니다
void ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) 
    { 
     using (ColorImageFrame colorFrame = e.OpenColorImageFrame()) 
     { 
      if (colorFrame != null) 
      { 
       colorFrameManager.Update(colorFrame); 
       BitmapSource thresholdedImage = 
        diceDetector.GetThresholdedImage(colorFrameManager.Bitmap); 

       if (thresholdedImage != null) 
       { 
        Display.Source = thresholdedImage; 
       } 
      } 

     } 
    } 

:

public void Update(ColorImageFrame colorFrame) 
    { 
     byte[] colorData = new byte[colorFrame.PixelDataLength]; 
     colorFrame.CopyPixelDataTo(colorData); 

     if (Bitmap == null) 
     { 
      Bitmap = new WriteableBitmap(colorFrame.Width, colorFrame.Height, 
       96, 96, PixelFormats.Bgr32, null); 
     } 
     int stride = Bitmap.PixelWidth * Bitmap.Format.BitsPerPixel/8; 
     imageRect.X = 0; 
     imageRect.Y = 0; 
     imageRect.Width = colorFrame.Width; 
     imageRect.Height = colorFrame.Height; 
     Bitmap.WritePixels(imageRect, colorData, stride, 0); 
    } 

그리고 'getThresholdedImage'-방법 외모 같은 :

public BitmapSource GetThresholdedImage(WriteableBitmap colorImage) 
    { 
     BitmapSource thresholdedImage = null; 
     if (colorImage != null) 
     { 
      try 
      { 
       Bitmap bitmap = BitmapConverter.ToBitmap(colorImage); 
       HSLFiltering filter = new HSLFiltering(); 
       filter.Hue = new IntRange(335, 0); 
       filter.Saturation = new Range(0.6f, 1.0f); 
       filter.Luminance = new Range(0.1f, 1.0f); 
       filter.ApplyInPlace(bitmap); 
       thresholdedImage = BitmapConverter.ToBitmapSource(bitmap); 
      } 
      catch (Exception ex) 
      { 
       System.Console.WriteLine(ex.Message); 
      } 
     } 
     return thresholdedImage; 
    } 

지금 프로그램이 많이 느려

/이 행이 실행될 때 응답하지 않습니다

filter.ApplyInPlace(bitmap); 

그래서 이미이 스레드 (C# image processing on Kinect video using AForge)를 읽었지만 EMGU를 시도했지만 내부 예외로 인해 작동하지 못하고 스레드 스타터가 4 개월 이상 온라인 상태가 아니었기 때문에 그의 작업 코드에서 답변을 얻지 못했습니다. 이제 첫째로 나는 느린 실행을위한 이유는

filter.ApplyInPlace(bitmap); 

수있는 방법이 이미지 처리 정말 너무 복잡인가 intereseted거야? 아니면 내 환경에 문제가 될 수 있습니까? 둘째 프레임 건너 뛰기가 좋은 해결책인지 묻고 싶습니다. 또는 500 밀리 초와 같이 매 폴링과 오픈 프레임을 사용하는 것이 더 좋습니다. 대단히 감사합니다!

답변

1

HSL 필터는 계산 속도를 늦추지 않지만 복잡한 필터는 아닙니다. Im을 문제없이 30fps로 320x240 이미지에 활용했습니다.

문제는 계산 된 이미지의 해상도 또는 너무 높은 프레임 속도 일 수 있습니다!

이미지의 해상도가 높으면 필터 적용 전에 크기를 조정하는 것이 좋습니다. 그리고 나는 주사위를 추적하기에 충분하다고 생각합니다.

+0

답변 해 주셔서 감사합니다. 이미지의 해상도는 640 * 480이고 일반적으로 프레임 속도는 초당 30 프레임을 더합니다. 현재 Kinect에서 세 번째 프레임 만 요청/사용하고 있으므로 초당 약 10 프레임으로 작업하고 있습니다. 그러나 나는 더 많은 이미지 처리 (주사위와 숫자를 알아 내기 위해해야만하는 것)를하면 프레임 속도가 크게 줄어들 것이라고 두려워합니다. 그럼에도 불구하고 이미지의 크기를 먼저 조정하고 프레임 속도가 변경되는지 확인하겠습니다. – vein

+1

번호를 추적하고 320 * 240의 해상도가 충분하지 않을까 두렵다면 약간 조정할 수 있습니다. 프레임을 가져 오면 복사본을 만들고 크기를 반으로 조정합니다 (320 * 240). 크기가 조정 된 사본은 RED 주사위를 추적하는 데 (더 빠름) 사용되므로 문제없이 HSL 필터를 적용 할 수 있습니다. RED 주사위가 프레임에 있으면 원래 이미지에서 사용할 좌표 (예 : X * 2)를 변환하여 숫자를 얻습니다. 하지만 간단한 크기 조정을 시도하기 전에 시도해 보시기 바랍니다. 320x240의 해상도로 충분하다고 생각합니다. – Univers3

+0

고맙습니다. 이것은 주사위를 추적 할 수있는 것처럼 잘 작동하는 것 같습니다. 일반적으로 프레임 속도는 초당 8-10 프레임 사이이지만이 프로젝트만으로 충분합니다. – vein