TIDOP-USAL / graphos

GRAPHOS
GNU General Public License v3.0
4 stars 0 forks source link

Error al mallar las nubes de puntos de MVS #17

Closed estebanrdo closed 1 year ago

estebanrdo commented 1 year ago

Cuando se realiza la densificación con MVS el fichero PLY resultante no es compatible con PoissonRecon.

estebanrdo commented 1 year ago

La cabecera del fichero PLY procedente de la densificación MVS es:

ply
format binary_little_endian 1.0
element vertex 2711873
property float32 x
property float32 y
property float32 z
property uint8 red
property uint8 green
property uint8 blue
property float32 nx
property float32 ny
property float32 nz
end_header

Si este fichero se abre y se salva desde CloudCompare la cabecera es la siguiente:

ply
format binary_little_endian 1.0
comment Created by CloudCompare v2.12.4 (Kyiv)
comment Created 2023-01-09T13:12:02
obj_info Generated by CloudCompare!
element vertex 2711966
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property float nx
property float ny
property float nz
end_header

Posibles soluciones:

estebanrdo commented 1 year ago

Finalmente se ha optado por modificar el código de PoissonRecon para que permita los tipos float32 y uint8 en la cabecera. Se modificó la función FromPlyType para permitir los tipos que faltaban. En concreto se han añadido:

La función FromPlyType queda de la siguiente forma:

    TypeOnDisk FromPlyType( int plyType )
    {
        switch( plyType )
        {
            case PLY_INT:    return TypeOnDisk::INT;
            case PLY_UINT:   return TypeOnDisk::UINT;
            case PLY_CHAR:   return TypeOnDisk::CHAR;
            case PLY_UCHAR:  return TypeOnDisk::UCHAR;
            case PLY_FLOAT:  return TypeOnDisk::FLOAT;
            case PLY_DOUBLE: return TypeOnDisk::DOUBLE;
            case PLY_INT_8:    return TypeOnDisk::CHAR;
            case PLY_UINT_8:    return TypeOnDisk::UCHAR;
            case PLY_INT_32:    return TypeOnDisk::INT;
            case PLY_UINT_32:   return TypeOnDisk::UINT;
            case PLY_FLOAT_32:  return TypeOnDisk::FLOAT;
            default: ERROR_OUT( "Unrecognized type: " , plyType );
        }
        return TypeOnDisk::UNKNOWN;
    }