Kinect裁剪图像

本文关键字:图像 裁剪 Kinect | 更新日期: 2023-09-27 18:10:49

我正在尝试裁剪视频RGB的矩形区域。首先,我找到了头部关节的坐标,并用这个坐标在RGB视频上画了一个矩形。现在我想在另一个视频中展示第一个图像中在矩形内的图像。如果有任何帮助就太好了。

video RGB在"RGBvideo"图像控件中显示。我想在"faceImage"图像控件中显示的裁剪图像

我在网上搜索了,但找不到解决办法。我糊涂了。

thank you so much

Kinect裁剪图像

欢迎来到Stack Overflow,请不要多次问同一个问题。对于像Kinect这样不太受欢迎的标签,人们可能需要一段时间才能回答(这个标签只有79个关注者)。

为简单起见,我将假设您想裁剪出一个固定大小的图像(例如,从原来的800x600像素中裁剪出60x60像素)。在你的VideoFrameReady方法中,你从事件参数中获得PlanarImage。这个PlanarImage有bits字段,它包含了图像的所有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坐标从头部跟踪。