2015-10-14 67 views
0

我正在C#wpf met de Kinect 2中做一個簡單的應用程序。我想創建一個綠色屏幕效果,如果用戶被檢測到。我正在使用SDK中的CoordinateMappingBasics示例。問題在於用戶的邊緣是「白色」,看起來不太好看。有什麼辦法可以在邊緣處實現模糊效果嗎?有什麼方法可以塗抹面膜嗎?我會感謝任何幫助!Kinect 2綠屏效果

// We'll access the body index data directly to avoid a copy 
using (KinectBuffer bodyIndexData = bodyIndexFrame.LockImageBuffer()) 
{ 
    unsafe 
    { 
     byte* bodyIndexDataPointer = (byte*)bodyIndexData.UnderlyingBuffer; 

     int colorMappedToDepthPointCount = this.colorMappedToDepthPoints.Length; 

     fixed (DepthSpacePoint* colorMappedToDepthPointsPointer = this.colorMappedToDepthPoints) 
     { 
      // Treat the color data as 4-byte pixels 
      uint* bitmapPixelsPointer = (uint*)this.bitmap.BackBuffer; 

      // Loop over each row and column of the color image 
      // Zero out any pixels that don't correspond to a body index 
      for (int colorIndex = 0; colorIndex < colorMappedToDepthPointCount; ++colorIndex) 
      { 
       float colorMappedToDepthX = colorMappedToDepthPointsPointer[colorIndex].X; 
       float colorMappedToDepthY = colorMappedToDepthPointsPointer[colorIndex].Y; 

       // The sentinel value is -inf, -inf, meaning that no depth pixel corresponds to this color pixel. 
       if (!float.IsNegativeInfinity(colorMappedToDepthX) && 
        !float.IsNegativeInfinity(colorMappedToDepthY)) 
       { 
        // Make sure the depth pixel maps to a valid point in color space 
        int depthX = (int)(colorMappedToDepthX + 0.5f); 
        int depthY = (int)(colorMappedToDepthY + 0.5f); 


        // If the point is not valid, there is no body index there. 
        if ((depthX >= 0) && (depthX < depthWidth) && (depthY >= 0) && (depthY < depthHeight)) 
        { 
         int depthIndex = (depthY * depthWidth) + depthX; 


         // If we are tracking a body for the current pixel, do not zero out the pixel 
         if (bodyIndexDataPointer[depthIndex] != 0xff) 
         { 
          continue; 

         } 
        } 
       } 

       bitmapPixelsPointer[colorIndex] = 0; 
      } 
     } 

     this.bitmap.AddDirtyRect(new Int32Rect(0, 0, this.bitmap.PixelWidth, this.bitmap.PixelHeight)); 
    } 
} 
} 
+0

如果您遇到類似的問題,例如[here](http://pterneas.com/2014/04/11/kinect-background-removal/),那麼您可能會使用較舊版本的Kinect v2 sdk。根據鏈接中的視頻,將Kinect v2 sdk升級到最新版本將消除白色效果。 –

+0

請讓我知道這是否有效。 –

+0

我正在使用SDK的最新版本,問題依然存在,但謝謝您的建議。 – Manuel

回答

0

這是一種很難解決的問題。我的建議是查看一個對象檢測腳本,matlab有幾個例子。然後,您可以將Kinects Depth數據和對象檢測框組合起來,以更準確地將邊緣四捨五入。

我對Kinect的建議是始終爲用戶提供高度對比的背景。確保您擁有良好的均勻照明,並嘗試最大化該人與其背後的任何物體/牆壁之間的距離。