2011-10-07 2 views
7

비디오 RGB의 직사각형 영역을 잘라내려고합니다. 먼저 헤드 조인트의 좌표를 찾고이 좌표로 RGB 비디오 위에 사각형을 그렸습니다. 이제 첫 번째 이미지에서 렌털 각도 내부에있는 이미지 만 다른 비디오에 표시하고 싶습니다. 어떤 도움이라도 좋을 것입니다.자르기 이미지 Kinect

비디오 RGB는 "RGB 비디오"이미지 컨트롤에 표시됩니다. 잘린 이미지 "faceImage"이미지 컨트롤에 표시하고 싶습니다.

온라인으로 검색했지만 해결책을 찾을 수 없습니다. 나는 혼란 스럽다.

은 스택 오버플로 당신에게

답변

11

에 오신 것을 환영합니다 너무 감사합니다, 같은 질문을 여러 번 요청하지 마십시오. Kinect와 같이 인기가없는 태그를 사용하면 사람들이 답변하는 데 약간의 시간이 걸릴 수 있습니다 (이 태그에는 팔로워가 79 명뿐입니다).

간단히 말하면, 원래 크기 인 800x600에서 60x60 픽셀과 같이 설정된 크기의 이미지를 자르려한다고 가정합니다. VideoFrameReady 메서드에서 이벤트 args에서 PlanarImage를 가져옵니다. 이 PlanarImage에는 비트 필드가 있습니다. 비트 필드에는 이미지의 모든 RGB 데이터가 들어 있습니다. 약간의 수학을 사용하면 작은 데이터 조각을 잘라 내고 작은 이미지로 사용할 수 있습니다.

// update video feeds 
void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e) 
{ 
    PlanarImage image = e.ImageFrame.Image; 

    // Large video feed 
    video.Source = BitmapSource.Create(image.Width, image.Height, 96, 96, PixelFormats.Bgr32, null, image.Bits, image.Width * image.BytesPerPixel); 

    // X and Y coordinates of the smaller image, and the width and height of smaller image 
    int xCoord = 100, yCoord = 150, width = 60, height = 60; 

    // Create an array to copy data into 
    byte[] bytes = new byte[width * height * image.BytesPerPixel]; 

    // Copy over the relevant bytes 
    for (int i = 0; i < height; i++) 
    { 
     for (int j = 0; j < width * image.BytesPerPixel; j++) 
     { 
      bytes[i * (width * image.BytesPerPixel) + j] = image.Bits[(i + yCoord) * (image.Width * image.BytesPerPixel) + (j + xCoord * image.BytesPerPixel)]; 
     } 
    } 

    // Create the smaller image 
    smallVideo.Source = BitmapSource.Create(width, height, 96, 96, PixelFormats.Bgr32, null, bytes, width * image.BytesPerPixel); 
} 

코드를 복사/붙여 넣기하는 대신 이해했는지 확인하십시오. 두 개의 for 루프는 기본 어레이 복사를위한 것으로 픽셀 당 바이트 수가 고려됩니다 (BGR32의 경우 4 개). 그런 다음 원본 데이터의 작은 부분 집합을 사용하여 새 BitmapSource를 만듭니다. 너비와 높이를 적절하게 변경하고 헤드 추적에서 X와 Y 좌표를 결정해야합니다.

+1

다른 사람의 질문에 대한 답변을 수락하는 방법은 무엇입니까? ;) – Dinushan

+0

도움 주셔서 감사합니다! 그러나 이것은 단지 자리에 머무를 것입니다. 따라서 머리를 추적하고 싶다면 머리를 움직일 때 smallVideo가 머리를 이미지 컨트롤에 맞추기 위해 움직일 것입니다. 그렇게하는 방법? 당신이 준 것은 어쨌든 나에게 큰 도움이되었습니다! – user981924

+0

@ user981924 : xCoord 및 yCoord 변수를 전역으로 설정해야합니다. 그런 다음 SkeletonFrameReady 이벤트에서 헤드의 위치에 따라 해당 변수를 변경합니다. (xCoord 또는 yCoord가 0보다 작은 경우 OutOfBoundsException이 발생할 수 있습니다) 경계 내에서 값을 유지해야합니다. – Coeffect