2011-10-07 41 views
7

Tôi đang cố gắng cắt vùng hình chữ nhật của video RGB. Đầu tiên tôi tìm thấy các tọa độ của khớp đầu và với tọa độ này tôi đã vẽ một hình chữ nhật trên video RGB. Bây giờ tôi muốn hiển thị trong một video khác chỉ là hình ảnh bên trong hình ảnh trong hình ảnh đầu tiên. Bất kỳ sự trợ giúp nào đều sẽ là tuyệt vời.Hình ảnh cắt ảnh Kinect

video RGB được hiển thị trong Điều khiển hình ảnh "RGBvideo". hình ảnh đã cắt tôi muốn hiển thị trong Điều khiển hình ảnh "faceImage"

Tôi đã tìm kiếm trực tuyến nhưng không thể tìm thấy giải pháp cho nó. Tôi nhầm lẫn.

cảm ơn bạn rất nhiều

Trả lời

11

Chào mừng bạn đến với Stack Overflow, vui lòng không hỏi cùng một câu hỏi nhiều lần. Với các thẻ ít phổ biến hơn như Kinect, có thể mất chút thời gian để mọi người trả lời (thẻ chỉ có 79 người theo dõi).

Để đơn giản, tôi giả sử bạn muốn cắt ra một hình ảnh có kích thước đã đặt (ví dụ: 60x60 pixel trong số 800x600 ban đầu). Trong phương thức VideoFrameReady của bạn, bạn nhận được PlanarImage từ sự kiện args. PlanarImage này có trường bit, chứa tất cả dữ liệu RGB cho hình ảnh. Với một chút toán học, bạn có thể cắt ra một đoạn nhỏ dữ liệu đó và sử dụng nó như một hình ảnh nhỏ hơn.

// 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); 
} 

Hãy đảm bảo bạn hiểu mã, thay vì chỉ sao chép/dán mã. Hai vòng lặp dành cho việc sao chép mảng cơ bản, với số byte trên mỗi pixel được tính đến (4 cho BGR32). Sau đó, bạn sử dụng tập hợp con nhỏ của dữ liệu gốc để tạo một BitmapSource mới. Bạn sẽ cần phải thay đổi chiều rộng/chiều cao như bạn thấy phù hợp và xác định tọa độ X và Y từ theo dõi đầu.

+1

cách chấp nhận câu trả lời cho câu hỏi của người khác? ;) – Dinushan

+0

Cảm ơn sự giúp đỡ của bạn! Nhưng điều này sẽ chỉ ở trong một vị trí. Vì vậy, nếu tôi muốn theo dõi đầu của tôi, khi đầu của tôi di chuyển, smallVideo cũng sẽ di chuyển để phù hợp với đầu của tôi vào điều khiển hình ảnh. làm thế nào để làm như vậy? Những gì bạn đưa ra đã giúp tôi rất nhiều! – user981924

+0

@ user981924: những gì bạn cần làm là tạo các biến xCoord và yCoord toàn cầu. Sau đó, trên sự kiện SkeletonFrameReady, hãy thay đổi các biến đó tùy thuộc vào vị trí của đầu. Chỉ cần chắc chắn rằng bạn giữ các giá trị trong giới hạn (nếu xCoord hoặc yCoord nhỏ hơn 0 ví dụ, bạn có nguy cơ OutOfBoundsException). – Coeffect

Các vấn đề liên quan