使用opencv棋盘进行多Kinect校准

时间:2013-08-19 11:28:45

标签: opencv kinect calibration

我正在使用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并且没有发现任何错误。 完成所有这些步骤后,我得到一个旋转矩阵和平移向量。当我做这些变换到我从kinects得到的点云时,我发现它们没有对齐。

不知道为什么。 我不认为这是关于图像的顺序。无论我将变换应用于哪个点云,我都无法得到正确的对齐方式。 我猜的唯一原因是opencv函数的参数。

感谢您的关注!!!

8-20 编辑: 虽然没有人回答我,但我有一个可能的原因: 点云基于像素,而我从opencv获得的矩阵基于米。 我已经将点云改为米,但它也不好。 我发现我得到的矩阵可能是正确的。 所以我怀疑它的显示功能可能有问题。 如果我找到答案,我会发布结论。

8-21 编辑: 我找到了原因。我在opencv和opengl之间的区别中犯了一个错误。 现在矩阵可以对齐两个点云,但不是很完美。

0 个答案:

没有答案