2012-01-09 31 views
15

Tôi đang sử dụng Microsoft Kinect SDK để lấy thông tin về độ sâu và màu sắc từ Kinect và sau đó chuyển thông tin đó thành một đám mây điểm. Tôi cần thông tin chiều sâu để ở trong thế giới thực với tọa độ trung tâm của máy ảnh như là nguồn gốc.Dữ liệu độ sâu Microsoft Kinect SDK cho các tọa độ thực tế

Tôi đã nhìn thấy một số chức năng chuyển đổi nhưng đây rõ ràng là dành cho trình điều khiển OpenNI và không phải của Microsoft. Tôi đã đọc rằng thông tin chiều sâu đến từ Kinect đã được tính bằng milimet, và được chứa trong 11bits ... hay cái gì đó.

Làm cách nào để chuyển đổi thông tin bit này thành các tọa độ thực tế mà tôi có thể sử dụng?

Cảm ơn trước!

Trả lời

10

này được phục vụ cho trong Kinect cho thư viện của Windows bằng cách sử dụng lớp Microsoft.Research.Kinect.Nui.SkeletonEngine, và các phương pháp sau đây:

public Vector DepthImageToSkeleton (
    float depthX, 
    float depthY, 
    short depthValue 
) 

Phương pháp này sẽ lập bản đồ hình ảnh sâu được tạo ra bởi Kinect thành một vector có thể mở rộng, dựa trên các phép đo thực tế.

Từ đó (khi tôi đã tạo ra một lưới trong quá khứ), sau khi liệt kê các mảng byte trong bitmap được tạo ra bởi các hình ảnh sâu Kinect, bạn tạo một danh sách mới của Vector chỉ tương tự như sau:

 var width = image.Image.Width; 
     var height = image.Image.Height; 
     var greyIndex = 0; 

     var points = new List<Vector>(); 

     for (var y = 0; y < height; y++) 
     { 
      for (var x = 0; x < width; x++) 
      { 
       short depth; 
       switch (image.Type) 
       { 
        case ImageType.DepthAndPlayerIndex: 
         depth = (short)((image.Image.Bits[greyIndex] >> 3) | (image.Image.Bits[greyIndex + 1] << 5)); 
         if (depth <= maximumDepth) 
         { 
          points.Add(nui.SkeletonEngine.DepthImageToSkeleton(((float)x/image.Image.Width), ((float)y/image.Image.Height), (short)(depth << 3))); 
         } 
         break; 
        case ImageType.Depth: // depth comes back mirrored 
         depth = (short)((image.Image.Bits[greyIndex] | image.Image.Bits[greyIndex + 1] << 8)); 
         if (depth <= maximumDepth) 
         { 
          points.Add(nui.SkeletonEngine.DepthImageToSkeleton(((float)(width - x - 1)/image.Image.Width), ((float)y/image.Image.Height), (short)(depth << 3))); 
         } 
         break; 
       } 

       greyIndex += 2; 
      } 
     } 

Bằng cách làm như vậy, kết quả cuối cùng từ đây là danh sách các vectơ được lưu trữ bằng milimet và nếu bạn muốn cm nhân với 100 (v.v.).

+0

Cảm ơn Lewis! Đó là chính xác những gì tôi đã được sau, mặc dù tôi vẫn không hiểu kinh doanh bitshifting để có được giá trị độ sâu. –

+1

Tôi tin rằng phương pháp DepthImageToSkeleton đã được cấu trúc lại thành MapDepthToSkeletonPoint trên đối tượng KinectSensor –

+0

Chỉ dành cho bản ghi: http://arena.openni.org/OpenNIArena/Applications/ViewApp.aspx?app_id=426 – EdgarT

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