Kinect обрезать изображение - PullRequest
7 голосов
/ 07 октября 2011

Я пытаюсь обрезать прямоугольную область видео RGB.Сначала я нашел координаты сустава головы, и с помощью этих координат я нарисовал прямоугольник над видео RGB.Теперь я хочу показать в другом видео только изображение, которое находится внутри разветвления на первом изображении.Любая помощь будет отличной.

видео RGB отображается в «RGBvideo» Image Control.обрезанное изображение, которое я хочу отобразить в элементе управления изображением "faceImage"

Я выполняю поиск в Интернете, но не могу найти решение для него.Я в замешательстве.

Большое спасибо

1 Ответ

11 голосов
/ 07 октября 2011

Добро пожаловать в Stack Overflow, пожалуйста, не задавайте один и тот же вопрос несколько раз. С менее популярными тегами, такими как Kinect, людям может потребоваться некоторое время, чтобы ответить (у тега только 79 подписчиков).

Для простоты я собираюсь предположить, что вы хотите обрезать изображение установленного размера (например, 60x60 пикселей из исходного 800x600). В вашем методе VideoFrameReady вы получаете 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 предназначены для базового копирования массива с учетом количества байтов на пиксель (4 для BGR32). Затем вы используете это небольшое подмножество исходных данных для создания нового BitmapSource. Вам нужно будет изменить ширину / высоту по своему усмотрению и определить координаты X и Y из отслеживания головы.

...