0

正確な aruco ポーズ推定を取得するのに問題があります。カメラに対する AR オブジェクトの変換は、本来あるべきよりも約 2 倍小さくなっています。下のスクリーンショットでは、カメラは実空間でマーカーから z=.40m 離れていますが、AR オブジェクトは仮想空間でわずか 0.20m しか離れていません。

チェス盤やアルコのマーカーで測った長さのパラメータに何かあるのではないかと思いましたか?

これらの機能を使用しました:

Aruco.estimatePoseSingleMarkers (コーナー、markerLength、camMatrix、distCoeffs、rvecs、tvecs);

ここで、markerLength = 0.122m で、4x4 aruco を横切る距離です (黒いボーダーは含まれません)。

    private void EstimatePoseCanonicalMarker (Mat rgbMat)
    {
        Aruco.estimatePoseSingleMarkers (corners, markerLength, camMatrix, distCoeffs, rvecs, tvecs);

        for (int i = 0; i < ids.total (); i++) {
            using (Mat rvec = new Mat (rvecs, new OpenCVForUnity.CoreModule.Rect (0, i, 1, 1)))
            using (Mat tvec = new Mat (tvecs, new OpenCVForUnity.CoreModule.Rect (0, i, 1, 1))) {
                // In this example we are processing with RGB color image, so Axis-color correspondences are X: blue, Y: green, Z: red. (Usually X: red, Y: green, Z: blue)
                Calib3d.drawFrameAxes (rgbMat, camMatrix, distCoeffs, rvec, tvec, markerLength * 0.5f);

                // This example can display the ARObject on only first detected marker.
                if (i == 0) {
                    UpdateARObjectTransform (rvec, tvec);
                }
            }
        }
    }

と:

CalcChessboardCorners (patternSize、squareSize、objectPoint、markerType);

ここで、squareSize = .0245m で、チェス盤上の 1 つのマスの間の距離 (m) です。

    private void CalcChessboardCorners (Size patternSize, float squareSize, MatOfPoint3f corners, MarkerType markerType)
    {
        if ((int)(patternSize.width * patternSize.height) != corners.rows ()) {
            Debug.Log ("Invalid corners size.");
            corners.create ((int)(patternSize.width * patternSize.height), 1, CvType.CV_32FC3);
        }

        const int cn = 3;
        float[] cornersArr = new float[corners.rows () * cn];
        int width = (int)patternSize.width;
        int height = (int)patternSize.height;

        switch (markerType) {
        default:
        case MarkerType.ChessBoard:
        case MarkerType.CirclesGlid:
            for (int i = 0; i < height; ++i) {
                for (int j = 0; j < width; ++j) {
                    cornersArr [(i * width * cn) + (j * cn)] = j * squareSize;
                    cornersArr [(i * width * cn) + (j * cn) + 1] = i * squareSize;
                    cornersArr [(i * width * cn) + (j * cn) + 2] = 0;
                }
            }
            corners.put (0, 0, cornersArr);

            break;
        case MarkerType.AsymmetricCirclesGlid:
            for (int i = 0; i < height; ++i) {
                for (int j = 0; j < width; ++j) {
                    cornersArr [(i * width * cn) + (j * cn)] = (2 * j + i % 2) * squareSize;
                    cornersArr [(i * width * cn) + (j * cn) + 1] = i * squareSize;
                    cornersArr [(i * width * cn) + (j * cn) + 2] = 0;
                }
            }
            corners.put (0, 0, cornersArr);

            break;
        }
    }

これらの値のいくつかを 2 倍にして再調整して、z 値が .40m に近づくかどうかを確認しましたが、変化していないようです。それは私を一種の無知に感じさせます。私は約 50 枚のキャリブレーション写真を撮りますが、それらはかなり多様です。カメラでさまざまな深度と角度をキャプチャしようとします。

何か案は?

ありがとうございます。さらに情報が必要な場合はお知らせください。

4

0 に答える 0