Estoy tratando de encontrar la rotación y la traducción de la función de homografía. Primero calculo los puntos característicos correspondientes y usando findHomography() calculé la Matriz de Homografía. Luego, usando decomposeHomographyMat(), obtuve cuatro resultados de rotación y traducción.

El código que usé está debajo:

Mat frame_1, frame_2;


frame_1 = imread("img1.jpg", IMREAD_GRAYSCALE);
frame_2 = imread("img2.jpg", IMREAD_GRAYSCALE);

vector<KeyPoint> keypts_1, keypts_2;
Mat desc1, desc2;

Ptr<Feature2D> ORB = ORB::create(100    );
ORB->detectAndCompute(frame_1, noArray(), keypts_1, desc1);
ORB->detectAndCompute(frame_2, noArray(), keypts_2, desc2);

Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("BruteForce-Hamming");
vector<DMatch> matches;
matcher->match(desc1, desc2, matches);

vector<Point2f>leftPts, rightPts;
    for (size_t i = 0; i < matches.size(); i++)
    {
        //queryIdx is the left Image
        leftPts.push_back(keypts_1[matches[i].queryIdx].pt);

        //trainIdx is the right Image
        rightPts.push_back(keypts_2[matches[i].trainIdx].pt);
    }

Mat cameraMatrix = (Mat1d(3, 3) << 706.4034, 0, 277.2018, 0, 707.9991, 250.6182, 0, 0, 1);
Mat H = findHomography(leftPts, rightPts);
vector<Mat> R, t, n;
decomposeHomographyMat(H, cameraMatrix, R, t, n);

Ahora, ¿cuál es la rotación y traslación correctas, al menos la más adecuada? Incluso verifiqué si la rotación es válida usando la función a continuación, y encontré que todas son válidas.

bool isRotationMatrix(Mat &R)
{
    Mat Rt;
    transpose(R, Rt);
    Mat shouldBeIdentity = Rt * R;
    Mat I = Mat::eye(3, 3, shouldBeIdentity.type());

    return  norm(I, shouldBeIdentity) < 1e-6;
}

Por favor, que alguien me sugiera, qué valor debo usar. ¿Y la traducción resultante es un valor escalado, que se puede usar directamente, a diferencia del caso de descomposición de Essential Matrix? Aprecio mucho si alguien puede guiarme para encontrar esto.

¡Agradeciéndote!

2
Althaf 13 nov. 2017 a las 15:06

2 respuestas

La mejor respuesta

Usé la función 'filterHomographyDecompByVisibleRefpoints' de Vaesper. Puedes consultar el código aquí.

Después de obtener las 2 posibles soluciones, tendrá que realizar algunas comprobaciones según su caso para encontrar la solución adecuada. Como utilicé la matriz de identidad para la matriz de la cámara, los valores de traducción obtenidos están en píxeles y deberán escalarse con algún sensor externo. En mi caso, la distancia entre la cámara y el objeto plano se fija en el eje z, por lo tanto, calculé lo que representa 1 píxel en unidades mundiales.

3
Ankit 20 dic. 2017 a las 09:22

¿Y la traducción resultante es un valor escalado, que se puede usar directamente, a diferencia del caso de descomposición de Essential Matrix?

Ay, no.

La referencia para las implementaciones de OpenCV, Malis & Vargas, dice esto en la p.8:

Observe que la traslación se estima hasta un factor escalar positivo

2
Felix Goldberg 20 dic. 2017 a las 00:31