私はopencv2.4.6とkinect sdkを使用してマルチキネクトキャリブレーションを行っています。Kinect から画像データを取得したら、それらを 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 を使用してエラーが見つからないため、コーナーの位置は正しいと思います。これらのすべての手順の後、回転行列と並進ベクトルを取得します。これらをキネクトから取得した点群に変換すると、それらが整列していないことがわかりました。
理由がわからない。画像の順番の問題ではないと思います。どの点群に変換を適用しても、正しい位置合わせができません。私が推測する唯一の理由は、opencv 関数のパラメーターです。
ご清聴ありがとうございました!!!
8-20 編集: 誰も答えてくれませんが、考えられる理由が 1 つあります。ポイント クラウドはピクセルに基づいていますが、opencv から取得したマトリックスはメートルに基づいています。点群をメートルに変更しましたが、これもダメです。私が得たマトリックスはおそらく正しいことがわかりました。したがって、表示機能に何か問題があるのではないかと思います。答えが見つかったら、結論を投稿します。
8-21編集:理由がわかりました。opencvとopenglの違いを間違えました。これで、マトリックスは 2 つの点群を整列できますが、完全ではありません。