에 오신 것을 환영합니다 너무 감사합니다, 같은 질문을 여러 번 요청하지 마십시오. 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 좌표를 결정해야합니다.
다른 사람의 질문에 대한 답변을 수락하는 방법은 무엇입니까? ;) – Dinushan
도움 주셔서 감사합니다! 그러나 이것은 단지 자리에 머무를 것입니다. 따라서 머리를 추적하고 싶다면 머리를 움직일 때 smallVideo가 머리를 이미지 컨트롤에 맞추기 위해 움직일 것입니다. 그렇게하는 방법? 당신이 준 것은 어쨌든 나에게 큰 도움이되었습니다! – user981924
@ user981924 : xCoord 및 yCoord 변수를 전역으로 설정해야합니다. 그런 다음 SkeletonFrameReady 이벤트에서 헤드의 위치에 따라 해당 변수를 변경합니다. (xCoord 또는 yCoord가 0보다 작은 경우 OutOfBoundsException이 발생할 수 있습니다) 경계 내에서 값을 유지해야합니다. – Coeffect