Estoy estoy trabajando en un básico de la aplicación de realidad aumentada en Android. Lo que hice hasta ahora es detectar un cuadrado con opencv y, a continuación, utilizando cvFindExtrinsicCameraParams2() que calcula una rotación y traslación de vector. Para esto he utilizado 4 puntos de objetos, que son sólo las esquinas de un cuadrado alrededor de (0,0,0) y las 4 esquinas de la plaza en la imagen.

Que esto produce en mí una muy buena rotación y traslación de la matriz. Yo también calcula la matriz de rotación con cvRodrigues2() ya que con esto es más fácil que la rotación del vector. Mientras yo la utilización de estos para sacar algunos puntos en la imagen que todo funciona correctamente. Mi siguiente paso es, sin embargo, para pasar estos vectores y la matriz de vuelta a java y, a continuación, utilizarlos con OpenGL para dibujar un cuadrado en un OpenGLView. La plaza debe ser exactamente alrededor de la plaza en la imagen que se muestra detrás de la OpenGLView.

Mi problema es que no puedo encontrar la manera correcta de utilizar la matriz de rotación y el vector de translación en OpenGL. Empecé con exactamente los mismos puntos de objetos, como se utiliza para las funciones de openCV. A continuación he aplicado la matriz de rotación y el vector de translación en casi cualquier forma posible de lo que podía pensar. Lamentablemente, ninguno de estos enfoques producir un resultado que es de todos modos cerca de lo que yo esperaba. ¿Alguien puede decirme cómo usarlos correctamente?

Hasta ahora, el «más cercano» resultados que he conseguido, fue cuando al azar multiplicando la matriz completa con -1. Pero la mayoría del tiempo las plazas todavía se ven espejo invertido o rotación de 180 grados. Así que supongo que fue sólo un golpe de suerte, pero no es el enfoque correcto.

Tal vez usted necesita para transponer algo.

OriginalEl autor Pandoro | 2010-09-14

2 Comentarios

  1. 10

    Bien después de algunas pruebas más, finalmente me las arreglé para conseguir que funcione. Mientras no lo entiendo… lo hace ‘trabajo’. Para cualquier persona que se necesita para hacer esto en el futuro, aquí está mi solución.

    float rv[3]; //the rotation vector
    float rotMat[9]; //rotation matrix
    float tv[3]; //translation vector.
    
    
    rv[1]=-1.0f * rv[1]; rv[2]=-1.0f * rv[2];
    //Convert the rotation vector into a matrix here.
    
    //Complete matrix ready to use for OpenGL
    float RTMat[] = {rotMat[0], rotMat[3], rotMat[6], 0.0f,
                     rotMat[1], rotMat[4], rotMat[7], 0.0f,
                     rotMat[2], rotMat[5], rotMat[8], 0.0f,
                     tv[0], -tv[1], -tv[2], 1.0f};

    Como genpfault dijo en su comentario, todo lo que debe ser transpuesto desde OpenGL desde OpenGL necesidades de una columna principal de la orden. (Gracias por el comentario, vi que en la página anterior.) Además, la y y la z ángulo de rotación, así como la y y la z de la traducción necesita ser multiplicada por -1. Esto es lo que me parece un poco raro. Por qué sólo esas y no los valores de x?

    Esto funciona como debería, supongo. Pero las esquinas de la no coinciden exactamente. Supongo que esto es causado por algún mal openGLView configuraciones. Así que aunque todavía no estoy 100% contento con mi solución supongo que es la respuesta a mi pregunta.

    +1. Muchas gracias por esta respuesta! También he encontrado que es útil! Saludos!
    Es esta la matriz ModelView o de la matriz de proyección?
    usted necesita para voltear y, z, debido a que open GL vistas hacia el eje z, y define su origen en la parte inferior izquierda, openCV tiene su origen en la parte superior izquierda y z es más probable que los positivos.

    OriginalEl autor Pandoro

  2. 2

    Pandoro del método que realmente funciona! En caso de que alguien preguntaba «cómo convertir la rotación del vector en una matriz de rotación» aquí es como yo lo hice. Por cierto, he usado estas en OpenGL 2, no ES.

    //use the rotation vector generated from OpenCV's cvFindExtrinsicCameraParams2() 
    float rv[] = {rotation->data.fl[0], rotation->data.fl[1], rotation->data.fl[2] }; 
    
    //use the translation vector generated from OpenCV's cvFindExtrinsicCameraParams2() 
    float tv[] = {translation->data.fl[0], translation->data.fl[1], translation->data.fl[2]} ; 
    
    float rm[9];
    //rotation matrix
    CvMat* rotMat = cvCreateMat (3, 3, CV_32FC1); 
    
    //rotation vectors can be converted to a 3-by-3 rotation matrix
    //by calling cvRodrigues2() - Source: O'Reilly Learning OpenCV
    cvRodrigues2(rotation, rotMat, NULL);
    
    for(int i=0; i<9; i++){
        rm[i] = rotMat->data.fl[i];
    }
    
    rv[1]=-1.0f * rv[1]; rv[2]=-1.0f * rv[2];
    //Convert the rotation vector into a matrix here.
    
    //Complete matrix ready to use for OpenGL
    float RTMat[] = {rm[0], rm[3], rm[6], 0.0f,
                 rm[1], rm[4], rm[7], 0.0f,
                 rm[2], rm[5], rm[8], 0.0f,
                 tv[0], -tv[1], -tv[2], 1.0f};

    Buena suerte!

    OriginalEl autor coder9

Dejar respuesta

Please enter your comment!
Please enter your name here