私の質問に対する答えを正確に見つけるのは難しいので、他の場所で十分に説明されていなくても、ここで質問したいと思います。誰もが私の結果に戻れるように、コードにソリューションを追加しようとしています。しかし、最初にそれを解決する必要があります。
OpenCVによる三角測量についてcv::triangulatePoints()
です。私はその貧弱な文書を知っていますが、ウィローガレージ(現在)で見つけることができます(文書2.4.9を検索してください)
- チェス盤のキャリブレーションには、角度の異なる22のステレオ画像(2つのカム)を使用します。安定した固有パラメータの場合。
- チェス盤のコーナーを手に入れました
cv::findChessboardCorners()
- オプション-
cv::cornerSubPix()
- すべてのチェス盤ポイントにobjectPoints
cv::Point3f( k*m_squareSize, j*m_squareSize,0.0f)
を作成します(k-チェス盤の幅、jチェス盤の高さ、またはその逆、squareSize =実世界のサイズ) - 2.-4を実行します。すべての画像に対して
- ここにすべてを入れてください:
cv::calibrateCamera(object_points1, image_points1, image.size(), intrinsic1, distCoeffs1, rvecs1, tvecs1);
この機能は私が望んでいたように完璧に機能します、私は2番目のカメラ画像でもそれをやっています。長い調査の結果、私はこれを見つけました。 cv::Mat R12 = R2*R1.t(); cv::Mat T12 = T2-R*T1;
これは、cam1とcam2の関係(R | T)用です。これはかなりうまく機能します。の結果でテストしましたcv::stereoCalibrate()
。- このステップでは、tvecsとrvecsを使用して、2Dも3D、3Dも2Dを再投影したいと思いました。最後に、
cv::projectPoints(object_points1[i],rvecs1[i],tvecs1[i],intrinsic1, distCoeffs1, imagePoints1);
->正常に動作します-たった1つのポイントで2Pixelの差から最大48 * 2*22ポイントを取得しました。しかし、2Dから3Dへの三角測量をこれ以上進めることはできません。私は持っています!あまりにも使用しますcv::triangulatePoints()
。どうすればこの作品を手に入れることができますか?
私がこれまでに行ったことは、良い結果が得られずに試みました。最初に、射影行列P1とP2が必要です。
cv::Matx34d P1 = cv::Matx34d( R1.at<double>(0,0), R1.at<double>(0,1), R1.at<double>(0,2), tvecs1[0].at<double>(0),
R1.at<double>(1,0), R1.at<double>(1,1), R1.at<double>(1,2), tvecs1[0].at<double>(1),
R1.at<double>(2,0), R1.at<double>(2,1), R1.at<double>(2,2), tvecs1[0].at<double>(2));
申し訳ありませんが、これは重く見えますが、回転行列(rodrigues(rvecs1、R1))とtranslationvectortvecs1のみです。これは間違っていますか?回転行列R1を逆にする必要がありますか?
次のステップ:左右の画像にimagePoints(Corners)が必要です。これらのimagePointsは、findChessboardCorners()から取得した歪みのないコーナーです。
cv::triangulatePoints(P1, P2, cv::Mat(undisPt_set1).reshape(1,2), cv::Mat(undisPt_set2).reshape(1,2), point3d);
point3dを使用した後は、4番目のパラメータが次のように削除された「4D」ポイントです。convertPointsHomogeneous(point3d.reshape(4, 1), point3dCam1);
これは私がこれまでに行ったことですが、機能していません。誰かが私が間違っていることを知っていますか?最後のステップで何か間違った考えはありますか?計算を試しましたが、projectionMatrixP1とP2についてはよくわかりません。[R | t]のように構築されていることは知っていますが、それは私のtvecsとtvecsですか?それは転置ですか、それとも逆ですか?どんな助けでも素晴らしいですが、plsはいくつかのコードや明確な手順で私を助けてくれます-私が読んで考える必要があるより多くのリンクではなく、私は本当に研究をしました、私は学習OpenCV本、OpenCV2クックブック、そしてここにハートリーとジッサーマンを持っています私の目の前で。しかし、私はそれに到達することはできません。