我正在使用 opencv2.4.6 和 kinect sdk 进行多 kinect 校准。从 kinects 获取图像数据后,我将它们转换为 opencv 图像,并遵循一些教程,例如 RGBDemo,并使用以下管道:
//find the corners
cv::findChessboardCorners(*image, patternSize, corners, CV_CALIB_CB_NORMALIZE_IMAGE|CV_CALIB_CB_ADAPTIVE_THRESH);
cvtColor(*image, gray_image, CV_BGR2GRAY);
cornerSubPix(gray_image, corners, cv::Size(5,5), cv::Size(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
//after I collect 20 sets of corners, do calibration
CalcCameraIntrinsic(corner_src, rgb_intr_src, coeff_src);
CalcCameraIntrinsic(corner_dist, rgb_intr_dist, coeff_dist);
cv::stereoCalibrate(patternPoints, corner_src, corner_dist, rgb_intr_src, coeff_src, rgb_intr_dist, coeff_dist,
cv::Size(width, height), R, T, E, F,
cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS, 50, 1e-6), cv::CALIB_FIX_INTRINSIC);
我认为我的角位置是正确的,因为我使用 drawChessboardCorners 并且没有发现错误。经过所有这些步骤,我得到了一个旋转矩阵和平移向量。当我对从 kinect 获得的点云进行这些转换时,我发现它们没有对齐。
不知道为什么。我不认为这与图像的顺序有关。无论我将变换应用于哪个点云,我都无法获得正确的对齐方式。我猜的唯一原因是opencv函数的参数。
谢谢关注!!!
8-20 编辑:虽然没有人回答我,但我得到一个可能的原因:点云是基于像素的,而我从 opencv 得到的矩阵是基于米的。我已将点云更改为米,但这也不好。我发现我得到的矩阵可能是正确的。所以我怀疑我的显示功能可能有问题。如果我找到答案,我会发布结论。
8-21 编辑:我找到了原因。我在opencv和opengl之间的区别上犯了一个错误。现在矩阵可以对齐两个点云,但不是很完美。