2011-10-07 13 views
7

Próbuję przyciąć prostokątny obszar wideo RGB. Najpierw znalazłem współrzędne przegubu głowy i przy tych współrzędnych narysowałem prostokąt nad obrazem RGB. Teraz chcę pokazać w innym filmie tylko obraz znajdujący się w środku płaskiego trójkąta na pierwszym obrazie. Każda pomoc byłaby świetna.Obraz kadru w kadrze

wideo RGB jest wyświetlane w opcji sterowania obrazem "RGBvideo". przycięte zdjęcie Chcę wyświetlić w "faceImage" Image Control

Wyszukiwanie w Internecie, ale nie mogłem znaleźć rozwiązania. Jestem zdezorientowany.

bardzo dziękuję

Odpowiedz

11

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.

+1

jak zaakceptować odpowiedź na czyjeś pytanie? ;) – Dinushan

+0

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

+0

@ 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