2016-01-20 3 views
2

J'essaie de créer une image .inr à échelle de gris pour la bibliothèque cgal, mais j'ai des problèmes avec le format de fichier.
This seems to be the best description of the format, mais il ne semble pas être complet et ne parle que de l'en-tête, pas des données elles-mêmes.
This seems to have a bit more information about the format, mais malheureusement c'est en français. Ce que j'essaye de faire est de représenter un objet comme un tableau 3D rempli de booléen, donc une position aurait la valeur 1 si elle est à l'intérieur de l'objet et 0 si elle est à l'extérieur. Ce que j'ai fait pour l'instant, basé sur le deuxième lien si je l'ai bien compris, est d'écrire après l'en-tête chaque plan z sur une ligne, avec le plan z suivant sur une nouvelle ligne.
J'ai donc les valeurs x des colonnes sur une ligne représentant la première ligne, puis les valeurs x de la deuxième ligne sur la même ligne, et comme cela y fois jusqu'à la dernière ligne. Je saute alors une ligne pour le nouveau plan z et écris les données de la même manière. Mais quand j'essaie de le mailler, le résultat est un cube au lieu d'un cylindre, comme si cgal (j'utilisais mesh_optimization_lloyd_example) ne se souciait pas des valeurs booléennes et ne maillait que le volume entier.Problèmes de compréhension du format de fichier .inr

J'ai essayé de regarder les fichiers .inr fournis avec les exemples (comme skull_2.9.inr), mais alors que l'en-tête était parfaitement lisible, aucun éditeur de texte ne pouvait lire les données d'image, ce qui me fait penser à quelque chose plus que d'écrire des 0 ou des 1.

Est-ce quelque chose sur le .inr qui est faux? Ou peut-être que j'utilise mal cgal?

Répondre

1

J'ai finalement réussi à le faire fonctionner, voici ce qui est nécessaire dans le cas où il aide quelqu'un.

En-tête: Il doit s'agir d'un multiple de 256 octets, y compris le retour chariot après la fin de l'en-tête, voici un exemple.

#INRIMAGE-4#{ // format type 
XDIM=150 // x dimension 
YDIM=200 // y dimension 
ZDIM=100 // z dimension 
VDIM=1 // dimension of the data, here 1 for scalar or 3 for thing like RGB values 
VX=5 // voxel size in x 
VY=5 // voxel size in y 
VZ=5 // voxel size in z 
// a higher voxel size results in a more precise 3D mesh 
TYPE=unsigned fixed // type of data written, can float, signed fixed or unsigned fixed, unclear if it makes a difference in my case 
SCALE=2**0 // not used by most programs apparently 
PIXSIZE=8 bits // size of a char, can be 8, 16, 32 or 64 
CPU=pc // the type of cpu for little/big endianness, pc is little endian 

// Fill with carriage returns until the header is a multiple of 256 bytes, including the end of the header (4 bytes including the line break) 

##} // the line break is included in the header count 

Maintenant, les données lui-même:
Malgré ce que la documentation semble impliquer, il n'y en a pas de sauts de ligne, tout est contigu. Les données doivent être écrites en binaire et non en ASCII (donc dans mon cas en C++ ce serait static_cast (espace [i] [j] [k])), remplacez le caractère par le type de données que vous utilisez). Un dernier caprice, le fichier semble être dans l'ordre des colonnes, donc si vous avez un tableau 3d en C (qui est row-major) vous devez transposer les plans (x, y) avant de les écrire.