Question

J'ai points dans l'espace 3D et leurs points d'image 2D correspondant. Comment puis-je faire un maillage de points 3D, puis la texture des faces triangle formé par le maillage?

Était-ce utile?

La solution

Notez que la fonction trisurf que vous essayiez à l'origine l'utilisation retourne un handle à un objet Patch . Si vous regardez la propriété 'FaceColor' pour les objets patch , vous pouvez voir qu'il n'y a pas d'option de 'texturemap'. Cette option est valable uniquement pour le 'FaceColor' propriété de surface objets . Vous devrez donc trouver un moyen de tracer votre surface triangulaire comme surface au lieu d'un objet Patch objet. Voici deux façons d'aborder ceci:

Si vos données dans une grille uniforme ...

Si les coordonnées de données de surface représente une grille uniforme de telle sorte que z est un ensemble rectangulaire de points qui vont de xmin à xmax dans l'axe des x et ymin à ymax dans l'axe des ordonnées, on peut tracer à l'aide de < a href = "https://www.mathworks.com/help/matlab/ref/surf.html" rel = "nofollow noreferrer"> surf au lieu de trisurf :

Z = ...  % N-by-M matrix of data
x = linspace(xmin, xmax, size(Z, 2));  % x-coordinates for columns of Z
y = linspace(ymin, ymax, size(Z, 1));  % y-coordinates for rows of Z
[X, Y] = meshgrid(x, y);               % Create meshes for x and y
C = imread('image1.jpg');              % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ...   % Plot surface (flips rows of C, if needed)
         'FaceColor', 'texturemap', ...
         'EdgeColor', 'none');
axis equal

Afin d'illustrer les résultats du code ci-dessus, j'initialise les données avec le Z = peaks;, utilisé le haut-image échantillon 'peppers.png', et définir les valeurs de x et y pour couvrir de 1 à 16. Il en est résulté la texture suivante surface -mapped:

Si vos données sont non uniformément espacées ...

Si vos données ne sont pas régulièrement espacées, vous pouvez créer un ensemble de coordonnées X et Y régulièrement espacés (comme je l'ai fait ci-dessus en utilisant meshgrid ), puis utilisez l'une des fonctions griddata ou href="https://www.mathworks.com/help/matlab/ref/triscatteredinterp.html" rel="nofollow noreferrer"> TriScatteredInterp pour interpoler une grille régulière de valeurs Z de votre jeu irrégulier de valeurs z. Je discute comment utiliser ces deux fonctions dans ma réponse à une autre question SO . Voici une version raffinée du code à l'aide TriScatteredInterp affiché (Note: Depuis R2013a scatteredInterpolant est l'alternative recommandée):

x = ...  % Scattered x data
y = ...  % Scattered y data
z = ...  % Scattered z data
xmin = min(x);
xmax = max(x);
ymin = min(y);
ymax = max(y);
F = TriScatteredInterp(x(:), y(:), z(:));  % Create interpolant
N = 50;  % Number of y values in uniform grid
M = 50;  % Number of x values in uniform grid
xu = linspace(xmin, xmax, M);         % Uniform x-coordinates
yu = linspace(ymin, ymax, N);         % Uniform y-coordinates
[X, Y] = meshgrid(xu, yu);            % Create meshes for xu and yu
Z = F(X, Y);                          % Evaluate interpolant (N-by-M matrix)
C = imread('image1.jpg');             % Load RGB image
h = surf(X, Y, Z, flipdim(C, 1), ...  % Plot surface
         'FaceColor', 'texturemap', ...
         'EdgeColor', 'none');
axis equal

Dans ce cas, vous devez first choisir les valeurs de N et M pour la taille de votre matrice Z. Afin d'illustrer les résultats du code ci-dessus, j'initialisation des données pour x, y et z comme suit et utilisé le haut-image échantillon 'peppers.png':

x = rand(1, 100)-0.5;  % 100 random values in the range -0.5 to 0.5
y = rand(1, 100)-0.5;  % 100 random values in the range -0.5 to 0.5
z = exp(-(x.^2+y.^2)./0.125);  % Values from a 2-D Gaussian distribution

Il en est résulté la surface cartographiée de texture suivant:

Notez qu'il y a des bords dentelés à proximité des coins de la surface. Ce sont des endroits où il y avait trop peu de points pour TriScatteredInterp pour adapter de manière adéquate une surface interpolée. leles valeurs de Z en ces points sont donc nan , ce qui entraîne le point de surface pas tracée.

Autres conseils

Si votre texture est déjà dans la géométrie proprement dite, vous pouvez simplement utiliser vieux mappage de texture régulière.

Le lien vers la documentation MathWorks de mappage de texture: http: //www.mathworks. com / accès / assistance / help / Techdoc / visualiser / f0-18164.html # f0-9250

Re-EDIT: Mise à jour le code un peu:

Essayez cette approche (je viens de le recevoir au travail).

 a=imread('image.jpg');
 b=double(a)/255;

 [x,y,z]=peaks(30);  %# This is a surface maker that you do have
                     %# The matrix [x,y,z] is the representation of the surface.

 surf(x,y,z,b,'FaceColor','texturemap')  %# Try this with any image and you 
                                         %# should see a pretty explanatory 
                                         %# result. (Just copy and paste) ;)

[x, y, z] est la 'surface' ou plutôt une matrice contenant un certain nombre de points sous la forme (x, y, z) qui sont sur la surface. Notez que l'image est étirée pour adapter la surface.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top