4

(u,v)画像の座標に三角形があります。(X,Y,Z)この三角形を、画像の三角形とテクスチャマッピングされた3D座標で描画したいと思います。

ここにu,v,X,Y,Z、三角形の3つの角を表す3つの要素を持つすべてのベクトルがあります。

私は非常に醜く、遅く、不十分な解決策を持っています。

  1. 画像の長方形の部分を抽出します
  2. 3点で定義された変換で3D空間に変換します
  3. 表面で描く
  4. 最後に、AlphaDataを使用して三角形の一部ではないものをすべてマスクします

確かにこれを行うためのより簡単な方法があるはずですか?

4

2 に答える 2

13

私はあなたにとって2つのステップを含むより良い解決策だと思うものを持っています。まず、画像の長方形の部分を抽出します。その半分はテクスチャマップとして使用される三角形のセクションであり、半分は無視されます。次に、このテクスチャマップは、四角形ではなく三角形としてレンダリングされるようにポイントが調整された3Dサーフェスオブジェクトに適用されます。

ここで示す例では、ポイントが「原点」(三角形の頂点)、ポイント「A」、およびポイント「B」としてラベル付けされている三角形があると仮定して、さまざまなパラメータに次の値を使用します。画像スペース(下の最初の画像のように):

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


射影変換によるテクスチャマップの抽出:

このステップでは、Image Processing Toolbox関数maketformimtransform使用して、テクスチャマップとして使用する三角形を含む画像の部分の射影変換を実行します。画像は長方形である必要があるため、ポイントで定義される追加の三角形セクション(O,B,C)を含める必要があることに注意してください。

ここに画像の説明を入力してください

必要な画像の三角形の部分は画像の右下半分にあり、追加の三角形の「フィラー」部分は左上にあります。この追加の三角形は画像の外側に広がる可能性があることに注意してください。これにより、デフォルトで画像の一部が黒で塗りつぶされます。上記の射影変換を実行するコードは次のとおりです。

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]);

このコードはtriTexture、入力画像と同じサイズの最終画像を作成することに注意してくださいimg


三角形のテクスチャマッピングされたサーフェスをプロットします。

x,y,z原点の座標が最初のインデックスにあり、ポイントAの座標が2番目のインデックスにあり、ポイントBの座標が次のようになるように変数の値を並べ替えたとすると、サーフェスのプロットは非常に簡単になります。3番目のインデックスで。これで、ポイントBの2つのコピーを含む2行2列のサーフェス座標の新しいセットを作成できますX,Y,Z。これにより、サーフェスの半分のみがレンダリングされます(つまり、半分にテクスチャマップとして目的の三角形のイメージが含まれます)。これを行うためのコードは次のとおりです。

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

これが作成されたテクスチャマッピングされた三角形のサーフェスです。テクスチャマップに元の画像の正しい三角形の部分が含まれていることを示すために挿入図が追加されています。

ここに画像の説明を入力してください

于 2010-03-26T18:05:24.887 に答える
0

WARPは役に立ちますか?

http://www.mathworks.com/access/helpdesk/help/toolbox/images/warp.html

于 2010-02-16T19:12:35.990 に答える