2013-07-10 24 views
0

我用的OpenCV和openNi校準Kinect和我的高清攝像頭,在RGBDCaptureKinect的方法, 它使用freenect_camera_to_world到我writre freenect_camera_to_world自己,但

產地代碼:

// camera -> world coordinate helper function 
void freenect_camera_to_world(freenect_device* dev, int cx, int cy, int wz, double* wx, double* wy) 
{ 
    double ref_pix_size = dev->registration.zero_plane_info.reference_pixel_size; 
    double ref_distance = dev->registration.zero_plane_info.reference_distance; 

     // We multiply cx and cy by these factors because they come from a 640x480 image, 

// but the zero plane pixel size is for a 1280x1024 image. 

// However, the 640x480 image is produced by cropping the 1280x1024 image 

// to 1280x960 and then scaling by .5, so aspect ratio is maintained, and 

// we should simply multiply by two in each dimension. 
double factor = 2 * ref_pix_size * wz/ref_distance; 
*wx = (double)(cx - DEPTH_X_RES/2) * factor; 
*wy = (double)(cy - DEPTH_Y_RES/2) * factor; 
} 

我自己編寫freenect_camera_to_world函數,但我不知道是不是?

void freenect_camera_to_world(int cx,int cy,int wz, double *wx,double *wy) 
{ 
double ref_pix_size = 0.1042; //how can I know these two value for my kienct? 
double ref_distance = 120.0; 

double factor = 2*ref_pix_size*wz/ref_distance; 
*wx = (double)(cx - DEPTH_X_RES/2)*factor; 
*wy = (double)(cy - DEPTH_Y_RES/2)*factor; 
} 

1,我怎麼能知道我的kienct這兩個值?ref_pix_size & ref_distance

2,它是爲「零面像素尺寸爲1280×1024的圖像。」一個標準? ?

回答

1

ref_pix_size & ref_distance包含在每個Kinect的硬件中,它們與Kinect和Kinect的不同之處在於深度攝像機由於在工廠粘貼在硬件板上時的微小差異而與攝像機不同。但你不必擔心,如果你直接從閱讀:

dev->registration.zero_plane_info.reference_pixel_size; 
dev->registration.zero_plane_info.reference_distance; 

您可以將您的Kinect的立體校準後肯定計算它們:http://wiki.ros.org/kinect_calibration/technical 但你並不需要手動校準它因爲freenect有很好的默認參數來使用FREENECT_DEPTH_REGISTERED對齊顏色和深度圖像。