Question

J'ai un triangle dans l' (u,v) les coordonnées dans l'image.Je voudrais attirer ce triangle au coordonnées 3D (X,Y,Z) la texture mappée avec le triangle de l'image.

Ici, u,v,X,Y,Z sont tous les vecteurs de trois éléments représentant les trois angles du triangle.

J'ai une très laid, lent et solution satisfaisante dans lequel j'ai:

  1. extraire une partie rectangulaire de l'image
  2. de le transformer en espace 3D avec la transformation définie par les trois points
  3. dessiner avec la surface
  4. enfin, en masquant tout ce qui n'est pas partie du triangle avec AlphaData

Il doit sûrement y avoir un moyen plus facile de faire cela?

Était-ce utile?

La solution

J'ai ce que je pense est une meilleure solution pour vous impliquant deux étapes.Tout d'abord, il extrait une partie rectangulaire de l'image, dont la moitié est de la section triangulaire à être utilisé en tant que texture et dont la moitié sera ignoré.Ensuite cette texture est appliquée à un 3-D de la surface de l'objet dont les points sont ajustées de façon à le rendre comme un triangle à la place d'un quadrilatère.

Pour l'exemple, je vais vous montrer ici, je vais utiliser les valeurs suivantes pour les différents paramètres, en supposant que vous avez un triangle dont les pointes sont étiquetés comme "l'origine" (triangle de sommet), point "A" et le point "B" dans l'espace image (comme dans la première image ci-dessous):

x = [0.1 0.9 0.8];   % [xorigin xA xB] coordinates in 3-D space
y = [0.9 0.1 0.8];   % [yorigin yA yB] coordinates in 3-D space
z = [0.1 0.1 0.9];   % [zorigin zA zB] coordinates in 3-D space
origin = [150 350];  % Vertex of triangle in image space
U = [300 -50];       % Vector from origin to point A in image space
V = [50 -250];       % Vector from origin to point B in image space
img = imread('peppers.png');  % Sample image for texture map


L'extraction de la texture de la carte via la transformation projective:

Cette étape utilise la Boîte À Outils De Traitement D'Image fonctions maketform et imtransform pour effectuer une transformation projective de la partie de l'image contenant le triangle que vous souhaitez utiliser en tant que texture.Notez que puisque les images doivent être de forme rectangulaire, un supplément de section triangulaire définie par les points de (O,B,C) doit être inclus.

enter image description here

La forme triangulaire de la partie de l'image que vous voulez être dans la partie inférieure droite de l'image, alors que les autres triangulaire de "remplissage" de la partie sera dans le coin supérieur gauche.Notez que cet triangle peut s'étendre en dehors de l'image, qui fera partie d'être remplis avec du noir par défaut.Voici le code pour effectuer la transformation projective illustré ci-dessus:

A = origin+U;  % Point A
B = origin+V;  % Point B
C = B-U;       % Point C
[nRows, nCols, nPages] = size(img);  % Image dimensions
inputCorners = [origin; ...          % Corner coordinates of input space
                A; ...
                B; ...
                C];
outputCorners = [1 nRows; ...        % Corner coordinates of output space
                 nCols nRows; ...
                 nCols 1; ...
                 1 1];
tform = maketform('projective', ...  % Make the transformation structure
                  inputCorners, ...
                  outputCorners);
triTexture = imtransform(img,tform, 'bicubic', ...  % Transform the image
                         'xdata', [1 nCols], ...
                         'ydata', [1 nRows], ...
                         'size', [nRows nCols]);

Notez que ce code va créer une image finale triTexture c'est la même taille que l'image d'entrée img.


Traçage de la forme triangulaire de la texture mappée surface:

Représentation de la surface est maintenant très simple, en supposant que vous avez commandé les valeurs dans votre x,y,z des variables telles que les coordonnées pour le point d'origine est dans les premiers indices, les coordonnées du point A sont dans la deuxième indices, et les coordonnées du point B sont dans la troisième indices.Vous pouvez maintenant créer de nouveaux ensembles de 2 par 2 coordonnées de surface X,Y,Z que contient deux copies du point B, ce qui provoque seulement la moitié de la surface de rendu (c'est à direla moitié contenant souhaité triangulaire de l'image en tant que texture).Voici le code pour faire cela:

index = [3 3; 1 2];  % Index used to create 2-by-2 surface coordinates
X = x(index);        % x coordinates of surface
Y = y(index);        % y coordinates of surface
Z = z(index);        % z coordinates of surface
hSurface = surf(X, Y, Z, triTexture, ...  % Plot texture-mapped surface
                'FaceColor', 'texturemap', ...
                'EdgeColor', 'none');
axis equal            % Use equal scaling on axes
axis([0 1 0 1 0 1]);  % Set axes limits
xlabel('x-axis');     % x-axis label
ylabel('y-axis');     % y-axis label
zlabel('z-axis');     % z-axis label

Et voici la texture mappée triangulaire de la surface, il crée, avec un encart ajouté afin de montrer que la texture contient la partie triangulaire de l'image d'origine:

enter image description here

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