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.).
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. –
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 –
Chỉ dành cho bản ghi: http://arena.openni.org/OpenNIArena/Applications/ViewApp.aspx?app_id=426 – EdgarT