2013-01-03 4 views
0

내가 키 넥트 SDK와 함께 일하고 나는 두 가지 방법으로 깊이 이미지 데이터를 필터링하는 것을 시도하고있다 :효율적인 키 넥트 깊이 이미지 (또는 대형 배열) 필터

  1. 플레이어와 연결되지 않은 모든 깊이를 제거
  2. 소정의 깊이보다 큰 모든 깊이 제거 특정 미만되는 플레이어의 몸의 부분을 보여 실질적으로있는

결과 (계산은 플레이어의 손목의 위치를 ​​형성한다) 센서로부터의 깊이.

아래 코드는 성능 분석을 실행할 때 성능이 좋지 않음을 입증하기 때문에 성능을 향상시킬 수있는 방법을 찾고 있습니다.

기본 문제는 배열에 깊이 값 이미지 크기가 640x480 인 307200 개의 값이 포함되어 있으며이 메서드를 초당 약 30 회 호출하려고합니다.

사람이 더 효율적으로 수행 할 수있는 방법에 대한 지침이 있습니까? 이 코드는 다른 부분에서 EmguCV 라이브러리를 사용하기 때문에 cvInvokeThreshold 메소드를 사용하여 문제를 해결했지만이 코드는 작동하지 않습니다.

더 많은 정보가 필요하면 알려주십시오.

많은 감사,

데이브 MCB

public static byte[] GetDepths(byte[] depths, DepthImagePixel[] depthPixels, int width, int height, int threshold) 
    { 

     Parallel.For(0, width, i => 
     { 
      for (int j = 0; j < height; j++) 
      { 
       //Have to calculate the index we are working on using i and j 
       int rawDepthDataIndex = i * height + j; 

       //gets the depth and player values 
       short depth = depthPixels[rawDepthDataIndex].Depth; 
       short player = depthPixels[rawDepthDataIndex].PlayerIndex; 

       if (player > 0 && depth < threshold) 
        depths[rawDepthDataIndex] = (byte)depth; 
       else 
        depths[rawDepthDataIndex] = 0; 
      } 


     }); 
     return depths; 
    } 
+0

난 당신이 이미 가지고있는 Parallel.For 이외의 최적화 생각할 수 없다을 사용하지만, 나는 코드의 작은 메모를해야합니까. 'Parallel.For (0, height, i => {for (int j = 0; j

+0

그 이유는 무엇입니까? 라운드는 너비가 더 큽니다 (680). 병렬 인덱스가 큰 인덱스를 사용하면 작은 인덱스보다 성능이 향상됩니다. – DMcB1888

+1

좋습니다. 보통 이미지를 행별로 처리합니다. 이미지는 행 방향으로 저장됩니다. 다른 방법을 시도해 보셨습니까? 코드를 빠르게 만드는 방법 중 하나는 이미지를 다운 샘플링하는 것입니다. 코드를 프로파일 링하여 가장 느린 명령을 확인하십시오. –

답변

0

안녕 난 깊이 이미지 컷에 problema 있습니다.

는이 코드

Using depthFrame As DepthImageFrame = e.OpenDepthImageFrame() 
      If depthFrame IsNot Nothing Then 
       ' Copy the pixel data from the image to a temporary array 
       Me.depthPixels = Me.smoothingFilter.CreateFilteredDepthArray(Me.depthPixels, depthFrame.Width, depthFrame.Height) 

       depthFrame.CopyDepthImagePixelDataTo(Me.depthPixels) 

       depthReceived = True 
      End If 
End Using