2014-10-27 20 views
5

Tôi đang theo dõi một quả bóng bằng cách sử dụng dữ liệu rgb từ kinect. Sau này tôi tìm kiếm dữ liệu độ sâu tương ứng. Cả hai điều này là làm việc lộng lẫy. Bây giờ tôi muốn có tọa độ x, y, z thực tế (tức là không gian bộ xương) thay vì các giá trị x_screen, y_screen và depth. Thật không may các phương pháp được đưa ra bởi các kinect sdk (http://msdn.microsoft.com/en-us/library/hh973078.aspx) don`t giúp tôi. Về cơ bản tôi cần một chức năng "NuiImageGetSkeletonCoordinatesFromColorPixel" nhưng tôi không tồn tại. Tất cả các chức năng về cơ bản đi theo hướng ngược lạiKinect: Từ không gian màu đến tọa độ thế giới

Tôi biết điều này có thể được thực hiện với openNI nhưng tôi không thể sử dụng nó vì các lý do khác.

Có chức năng nào thực hiện việc này cho tôi hoặc tôi có phải tự thực hiện chuyển đổi không? Nếu tôi phải tự làm, tôi sẽ làm như thế nào? Tôi phác thảo một sơ đồ nhỏ http://i.imgur.com/ROBJW8Q.png - bạn có nghĩ rằng điều này có hiệu quả không?

+0

Tại sao ['NuiTransformDepthImageToSkeleton'] (http://msdn.microsoft.com/en-us/library/jj663871.aspx) không hoạt động cho bạn? –

+0

Tôi theo dõi bằng màu. Vì vậy, tôi có x, y trong "rgb-space". Sau đó tôi chuyển dữ liệu chiều sâu của mình thành không gian rgb bằng cách sử dụng một hàm sdk khác: NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution để tìm kiếm giá trị độ sâu tương ứng. Thật không may là không có nghịch đảo của chức năng này vì vậy tôi không có cách nào để quay trở lại không gian sâu. Nhưng đối với NuiTransformDepthImageToSkeleton tôi cần x, y trong không gian sâu: ( [EDIT]: Hay đây thực sự chỉ là quan niệm sai lầm của tôi? Khi họ nói "Tọa độ x của pixel sâu" trong tài liệu, chúng có thực sự không có nghĩa là x, y trong không gian RGB? – AnonEnginerd

+1

Ah xin lỗi tôi hiểu lầm ... Tôi sẽ thấy [câu hỏi này] (http://stackoverflow.com/questions/11902593/get-depth-at-color-position-kinect-sdk) vì âm thanh chính xác như những gì bạn muốn –

Trả lời

3

Kiểm tra CameraIntrinsics.

typedef struct _CameraIntrinsics 
{ 
    float FocalLengthX; 
    float FocalLengthY; 
    float PrincipalPointX; 
    float PrincipalPointY; 
    float RadialDistortionSecondOrder; 
    float RadialDistortionFourthOrder; 
    float RadialDistortionSixthOrder; 
} CameraIntrinsics; 

Bạn có thể tải từ ICoordinateMapper::GetDepthCameraIntrinsics.

Sau đó, đối với mỗi điểm ảnh (u,v,d) trong không gian chiều sâu, bạn có thể lấy tọa độ trong không gian thế giới bằng cách làm này:

x = (u - principalPointX)/focalLengthX * d; 
y = (v - principalPointY)/focalLengthY * d; 
z = d; 

Đối với không gian màu pixel, bạn cần phải đầu tiên tìm thấy liên quan đến điểm ảnh không gian chiều sâu của nó, mà bạn nên sử dụng ICoordinateMapper::MapCameraPointTodepthSpace. Vì không phải tất cả pixel màu đều có pixel sâu tương ứng (1920x1080 so với 512x424), nên bạn không thể có đám mây điểm màu full-HD.

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