Как установить поворот камеры Раджавали, используя матрицу перевода и матрицу вращения из функции opencv pnpRansac ()? - PullRequest
0 голосов
/ 09 мая 2018

Я работаю над приложением Android AR. Я использую библиотеку RAJAWALI для рендеринга AR и openCV для обнаружения и отслеживания целей. Я вычисляю матрицу вращения и перемещения, используя функцию PNPRansac от opencv.

    cv::Mat rotation=cv::Mat::zeros(3, 1, CV_64FC1);
    cv::Mat translation=cv::Mat::zeros(3, 1, CV_64FC1);
    TranslationMatrix=cv::Mat::zeros(3, 1, CV_64FC1);
    RotationMatrix=cv::Mat::zeros(3, 3, CV_64FC1);
    if (!cv::solvePnPRansac(objectPoints_float,
                            scenePoints_float,
                            cameraParams.cameraMatrix,
                            cameraParams.distortionMatrix,
                            rotation,
                            translation,
                            false,
                            iterationsCount,
                            cameraParams.reprojectionError,
                            confidence)) {

        rotation.release();
        translation.release();
        return;
    }

    TranslationMatrix = translation;

    cv::Rodrigues(rotation,
                  RotationMatrix); // converts Rotation Vector to Matrix
    cv::Mat R_t, A;
    R_t = cv::Mat::zeros(3, 3, CV_64FC1);
    A = cv::Mat::zeros(3, 1, CV_64FC1);
    A.at<double>(0, 0) = 0;//[0]
    A.at<double>(1, 0) = 0;//[0]
    A.at<double>(2, 0) = 1;//[1]
    //transpose of rotation matrix
    R_t = RotationMatrix.t();

    // Reference for this formula https://en.wikipedia.org/wiki/Camera_resectioning
    cameraPosition = -1 * (R_t * TranslationMatrix);

    //CameraOrientation = R_t * A;
    //CameraOrientation = rot2euler(RotationMatrix).clone();

Я пытаюсь передать это вращение и положение на камеру Раджавали, чтобы получить опыт AR. Положение кажется правильным, но вращение установлено неправильно. У меня есть это в onRender сцены Раджавали:

    // Get camera position and rotation from C++ to Java using native method
    getCameraPositionRotation(cameraPosition.getNativeObjAddr(), cameraOrientation.getNativeObjAddr());

    double POSx = cameraPosition.get(0, 0)[0] / 1000;
    double POSy = cameraPosition.get(1, 0)[0] / 1000;
    double POSz = cameraPosition.get(2, 0)[0] / 1000;
    double ROTx = Math.toDegrees(cameraOrientation.get(0, 0)[0]);
    double ROTy = Math.toDegrees(cameraOrientation.get(1, 0)[0]);
    double ROTz = Math.toDegrees(cameraOrientation.get(2, 0)[0]);
    getCurrentCamera().setPosition(POSx, POSy, POSz);
    getCurrentCamera().setRotation(ROTx,ROTy,ROTz);

Как правильно настроить вращение камеры Раджавали?

...