2012-08-28 2 views
7

안녕하세요. 일부 이미지 처리를 시도하고 있습니다. 저는 Microsoft Kinect를 사용하여 방에서 사람을 감지합니다. 당신의 행동을 볼 수 있도록이 비디오 시퀀스에서 노이즈를 제거하려면 어떻게해야합니까?

http://www.screenr.com/h7f8

내가 비디오를 넣어 : 나는 사람이 장면을 입력하고 주변 산책 할 때 깊이 데이터는, 몇 가지 배경 빼기 작업을 수행하고이 같은 비디오 시퀀스로 끝날 수 비디오의 노이즈. 다른 색상은 서로 다른 수준의 깊이를 나타냅니다. 흰색은 비어 있음을 나타냅니다. 보시다시피, 꽤 시끄 럽습니다. 특히 붉은 소음.

최대한 인간을 제외한 모든 것을 제거해야합니다. 침식/팽창 (매우 큰 창 크기 사용)을 할 때 나는 많은 소음을 제거 할 수 있지만 사용할 수있는 다른 방법이 있는지 궁금해했습니다. 특히 비디오의 빨간 노이즈는 침식/팽창을 사용하여 제거하기가 어렵습니다.

일부 노트 : 어떤 장면에서 인간하지만 우리가하는 배경 공제가 완전 자동이다가 없을 때 우리가 알고 있던 경우에

1) 더 나은 배경 빼기 할 수 있고 인간이에있을 때조차 작동 장면과 심지어 카메라가 움직일 때도 그렇습니다. 그래서 이것은 우리가 지금 얻을 수있는 최고의 배경 빼기입니다.

2) 알고리즘은 실시간으로 임베디드 시스템에서 작동합니다. 그래서 더 효율적이고 쉬운 알고리즘이 더 좋습니다. 그리고 완벽 할 필요는 없습니다. 복잡한 신호 처리 기술도 환영합니다 (임베디드, 실시간 처리가 필요하지 않은 다른 프로젝트에서 사용할 수도 있음).

3) 실제 코드가 필요하지 않습니다. 그냥 아이디어.

+0

배경 빼기에 대해 더 많이 알면 도움이 될 수 있습니다. 이미지에 노이즈가 남아있는 이유는 무엇입니까? – jpa

+0

어떤 SDK/드라이버를 사용하고 있습니까 (예 : MS Kinect SDK, OpenNI, libfreenect 등)? –

답변

0

Kinect SDK를 사용하는 경우 매우 간단합니다. 나는 깊이의 기초에 대한 this 비디오를 다음과 같은 것을 할 것 :

private byte[] GenerateColoredBytes(DepthImageFrame depthFrame) 
    { 

     //get the raw data from kinect with the depth for every pixel 
     short[] rawDepthData = new short[depthFrame.PixelDataLength]; 
     depthFrame.CopyPixelDataTo(rawDepthData); 

     //use depthFrame to create the image to display on-screen 
     //depthFrame contains color information for all pixels in image 
     //Height x Width x 4 (Red, Green, Blue, empty byte) 
     Byte[] pixels = new byte[depthFrame.Height * depthFrame.Width * 4]; 

     //Bgr32 - Blue, Green, Red, empty byte 
     //Bgra32 - Blue, Green, Red, transparency 
     //You must set transparency for Bgra as .NET defaults a byte to 0 = fully transparent 

     //hardcoded locations to Blue, Green, Red (BGR) index positions  
     const int BlueIndex = 0; 
     const int GreenIndex = 1; 
     const int RedIndex = 2; 


     //loop through all distances 
     //pick a RGB color based on distance 
     for (int depthIndex = 0, colorIndex = 0; 
      depthIndex < rawDepthData.Length && colorIndex < pixels.Length; 
      depthIndex++, colorIndex += 4) 
     { 
      //get the player (requires skeleton tracking enabled for values) 
      int player = rawDepthData[depthIndex] & DepthImageFrame.PlayerIndexBitmask; 

      //gets the depth value 
      int depth = rawDepthData[depthIndex] >> DepthImageFrame.PlayerIndexBitmaskWidth; 

      //.9M or 2.95' 
      if (depth <= 900) 
      { 
       //we are very close 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 
      // .9M - 2M or 2.95' - 6.56' 
      else if (depth > 900 && depth < 2000) 
      { 
       //we are a bit further away 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 
      // 2M+ or 6.56'+ 
      else if (depth > 2000) 
      { 
       //we are the farthest 
       pixels[colorIndex + BlueIndex] = Colors.White.B; 
       pixels[colorIndex + GreenIndex] = Colors.White.G; 
       pixels[colorIndex + RedIndex] = Colors.White.R; 
      } 


      ////equal coloring for monochromatic histogram 
      //byte intensity = CalculateIntensityFromDepth(depth); 
      //pixels[colorIndex + BlueIndex] = intensity; 
      //pixels[colorIndex + GreenIndex] = intensity; 
      //pixels[colorIndex + RedIndex] = intensity; 


      //Color all players "gold" 
      if (player > 0) 
      { 
       pixels[colorIndex + BlueIndex] = Colors.Gold.B; 
       pixels[colorIndex + GreenIndex] = Colors.Gold.G; 
       pixels[colorIndex + RedIndex] = Colors.Gold.R; 
      } 

     } 


     return pixels; 
    } 

이 흰색 인간을 제외한 모든 회전을하고, 인간은 금이다. 희망이 도움이!

편집

나는 당신이 반드시 코드 단지 아이디어를 원하지 않았다 알고, 그래서를 제외하고 흰색 깊이를 발견 알고리즘, 인간의 양을 발견 한 색상의 모든 것을 찾을 말할 것 인간. 나는이 모든 것을 제공했지만, 당신이 무슨 일이 일어나고 있는지 알지 못했습니다. 또한 최종 프로그램 이미지가 있습니다.

image1

참고 : 나는 관점의 두 번째 깊이 프레임을 추가

0

나는 (내가 그것에 대해 처리하지 않고 비디오를 필요할 것) 틀렸을 수도 있지만, 난 당신 말을 경향 것 조명 변화를 없애려고합니다.

이것은 '실제'환경에서 사람 탐지를 어렵게 만드는 이유입니다.

일부 링크의 경우 this other SO question을 확인할 수 있습니다.

나는 당신과 같은 구성으로 실시간으로 사람을 감지하지만 단안 시각을 사용했습니다. 필자의 경우 실제로 좋은 기술자는 LBPs이며 주로 텍스처 분류에 사용됩니다. 이것은 매우 간단합니다 (웹 전체에 구현되어 있습니다).

LBP는 기본적으로 움직임이 감지되는 관심 영역을 정의하는 데 사용되므로 이미지의 일부만 처리하고 모든 노이즈를 제거 할 수 있습니다.

이 논문에서는 이미지의 회색조 보정에 LBP를 사용합니다.

희망은 새로운 아이디어를 제시합니다.

2

그냥 내 두 센트 : 당신이 그 용 SDK를 사용하여 괜찮다면

는, 당신은 아주 쉽게 무법자 여우 원숭이 쇼로 PlayerIndexBitmask를 사용하는 사람 만 픽셀을 유지할 수 있습니다.

이제 드라이버에 대한 의존성을 원하지 않고 이미지 처리 수준에서 수행하려고 할 수 있습니다. 우리가 프로젝트에서 시도하고 꽤 잘 작동하는 접근 방식은 윤곽 기반이었습니다. 우리는 백그라운드 뺄셈 (background subtraction)으로 시작한 다음, 이미지에서 가장 큰 윤곽을 발견했습니다 (일반적으로 남아있는 노이즈는 매우 작은 얼룩 이었으므로). 어떤 종류의 중간 값 필터링을 첫 번째 통과로 사용할 수도 있습니다.

물론 이것은 모든 경우에 완벽하거나 적합하지 않으며 아마도 더 좋은 방법이있을 것입니다. 그러나 당신이 어떤 아이디어를 생각해 내는데 도움이되는 경우를 대비해서 그것을 버리고 있습니다.

+0

+1 이것은 모든 언어/소스에 적용될 수 있습니다. –

1

eyesweb을 살펴보십시오.

kinect 장치를 지원하는 설계 플랫폼이며 출력에 노이즈 필터를 적용 할 수 있습니다. 그것은 시스템 설계를위한 매우 유용하고 간단한 도구입니다.

관련 문제