最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

pctransform

構文

ptCloudOut = pctransform(ptCloudIn,tform)
ptCloudOut = pctransform(ptCloudIn,D)

説明

ptCloudOut = pctransform(ptCloudIn,tform) は、指定された 3 次元アフィン変換 tform を点群 ptCloudIn に適用します。変換は、剛体変換または非剛体変換にすることができます。

ptCloudOut = pctransform(ptCloudIn,D) は変位場 D を点群に適用します。変位場を使用する点群変換は、点群の各点を基準に変換を定義します。

すべて折りたたむ

この例では、3 次元点群のアフィン変換を説明します。指定するフォワード変換は、剛体変換または非剛体変換にすることができます。ここで示す変換には、入力点群の回転 (剛体変換) とせん断 (非剛体変換) が含まれます。

点群をワークスペースに読み取ります。

ptCloud = pcread('teapot.ply');

3 次元点群の回転

z 軸に沿って 45 度の回転を定義するアフィン変換オブジェクトを作成します。

A = [cos(pi/4) sin(pi/4) 0 0; ...
     -sin(pi/4) cos(pi/4) 0 0; ...
     0 0 1 0; ...
     0 0 0 1];
tform = affine3d(A);

点群を変換します。

ptCloudOut1 = pctransform(ptCloud,tform);

3 次元点群のせん断

x 軸に沿ってせん断を定義するアフィン変換オブジェクトを作成します。

A = [1 0 0 0; ...
     0.75 1 0 0; ...
     0.75 0 1 0; ...
     0 0 0 1];
tform = affine3d(A);

点群を変換します。

ptCloudOut2 = pctransform(ptCloud,tform);

元の 3 次元点群とアフィン変換後の 3 次元点群の表示

元の 3 次元点群をプロットします。

figure1 = figure('WindowState','maximized');
axes1 = axes('Parent',figure1,'Position',[0.28 0.54 0.46 0.41]);
pcshow(ptCloud,'Parent',axes1); 
xlabel('X');
ylabel('Y');
zlabel('Z');
title('3-D Point Cloud','FontSize',14)

回転およびせん断アフィン変換後の 3 次元点群をプロットします。

axes2 = axes('Parent',figure1,'Position',[0.15 0.02 0.35 0.42]);
pcshow(ptCloudOut1,'Parent',axes2);
xlabel('X');
ylabel('Y');
zlabel('Z');
title({'Rotation of 3-D Point Cloud'},'FontSize',14)

axes3 = axes('Parent',figure1,'Position',[0.5 0.02 0.35 0.42]);
pcshow(ptCloudOut2,'Parent',axes3);
xlabel('X');
ylabel('Y');
zlabel('Z');
title({'Shearing of 3-D Point Cloud'},'FontSize',14)

点群をワークスペースに読み取ります。

ptCloud = pcread('teapot.ply');

点群と同じサイズの変位場 D を作成します。

D = zeros(size(ptCloud.Location));

最初の半分の点の x 軸に沿った変位場の値を 7 に設定します。

pthalf = ptCloud.Count/2;
D(1:pthalf,1) = 7;

pointCloud メソッドfindNeighborsInRadiusを使用して、関心領域 (ROI) 内の点のインデックスを抽出します。ROI 内の点の x 軸、y 軸、および z 軸に沿った変位場の値をそれぞれ、4、4、-2 に設定します。

indices = findNeighborsInRadius(ptCloud,[0 0 3.1],1.5);
D(indices,1:2) = 4;
D(indices,3) = -2;

変位場を使用して点群を変換します。

ptCloudOut = pctransform(ptCloud,D);

元の点群と変換後の点群を表示します。

figure1 = figure('WindowState','maximized');
axes1 = axes('Parent',figure1,'Position',[0.03 0.4 0.35 0.42]);
pcshow(ptCloud,'Parent',axes1)
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Original 3-D Point Cloud','FontSize',14)

axes2 = axes('Parent',figure1,'Position',[0.4 0.4 0.38 0.42]);
pcshow(ptCloudOut,'Parent',axes2)
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Transformed 3-D Point Cloud Using Displacement Field','FontSize',14)

入力引数

すべて折りたたむ

点群。pointCloud オブジェクトとして指定します。

3 次元アフィン幾何学的変換。affine3d オブジェクトとして指定します。tform 入力の設定方法の詳細については、変換行列の定義 (Image Processing Toolbox)を参照してください。

変位場。M 行 3 列の配列または M x N x 3 の配列として指定します。変位場は、点群の各点の変換の大きさと方向を指定する一連の変位ベクトルです。変位場のサイズは、pointCloud オブジェクトの Location プロパティと同じサイズでなければなりません。

データ型: single | double

出力引数

すべて折りたたむ

変換後の点群。pointCloud オブジェクトとして返されます。変換は、点およびその法線ベクトルの座標軸に適用されます。

R2015a で導入