Witamy na przepełnienie stosu, proszę nie pytać samo pytanie wielokrotnie. W przypadku mniej popularnych tagów, takich jak Kinect, odpowiedź może zająć trochę czasu (znacznik ma tylko 79 obserwujących).
Dla uproszczenia, zakładam, że chcesz wykadrować obraz o ustalonym rozmiarze (na przykład 60x60 pikseli z oryginalnego rozmiaru 800x600). W swojej metodzie VideoFrameReady, otrzymujesz PlanarImage z argumentów zdarzenia. To PlanarImage ma pole bitów, które zawiera wszystkie dane RGB dla obrazu. Przy odrobinie matematyki możesz wyciąć niewielką część danych i użyć go jako mniejszego obrazu.
// 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);
}
Proszę zrozumieć kod, zamiast go tylko skopiować/wkleić. Obie pętle służą do podstawowego kopiowania tablic, z uwzględnieniem liczby bajtów na piksel (4 dla BGR32). Następnie użyjesz tego małego podzestawu oryginalnych danych, aby utworzyć nowy BitmapSource. Będziesz musiał zmienić szerokość/wysokość, jak uważasz, i określić współrzędne X i Y ze śledzenia głowy.
jak zaakceptować odpowiedź na czyjeś pytanie? ;) – Dinushan
Dziękujemy za pomoc! Ale to pozostanie tylko w pozycji. Więc jeśli chcę śledzić moją głowę, kiedy moja głowa się poruszy, smallVideo również się poruszy, dopasowując moją głowę do kontroli obrazu. jak to zrobić? To, co mi dałeś, było dla mnie wielką pomocą! – user981924
@ user981924: musisz ustawić zmienne xCoord i yCoord na globalne. Następnie, w zdarzeniu SkeletonFrameReady, zmień te zmienne w zależności od położenia głowy. Po prostu upewnij się, że trzymasz wartości w granicach (jeśli na przykład xCoord lub yCoord jest mniejsze niż 0, ryzykujesz OutOfBoundsException). – Coeffect