5

解決できないように見える 3D 数学の問題があります。

3点のデータがあります。データは平面上の (2D) 座標であり、3D 空間のどこかに浮かんでいます。投影の(2D)座標も知っています。その結果、次のデータ配列が得られます。

[[[x1,y1], [px1,py1],
 [[x2,y2], [px2,py2],
 [[x3,y3], [px3,py3]]

法線 (x1 など) の座標は平面上の座標を表し、もう一方 (px1 など) は投影された座標を表します。

私がやりたいことは、新しい2D 座標 ([x4,y4]) を投影することです。

.

私がこれまでに試したこと:

もちろん、投影用の目が必要なので、[xe,ye,-1] に設定します。xeとyeは知られています。(写真参考なので、目は写真中央に合わせました。)

目の下に投影面 (z=0) を配置しました。これにより、次の投影座標が得られます。

[[[x1,y1], [px1,py1,0],
 [[x2,y2], [px2,py2,0],
 [[x3,y3], [px3,py3,0]]

私はその平面について何も知らないので、平面上の座標に対して同じことを行うことはできません。

また、目から投影座標を通る線のパラメーター化された式を作成できることもわかりました。line1 の場合は次のようになります。

line1x = xe+(px1-xe)*t1
line1y = ye+(py1-ye)*t1
line1z = -1+t1 // = -1+(0--1)*t1

3D での点間の距離もわかっています。それは2Dでも同じです。つまり、point1 と point2 の間の距離は sqrt((x1-x2)^2+(y1-y2)^2) になります。

また、線 (line1 と line2) の間の距離もいつでもわかります。つまり、sqrt((line1x-line2x)^2+(line1y-line2y)^2+(line1z-line2z)^2) です。

しかし、ここから先の行方はよくわかりません... あるいは、これが正しいルートなのかどうかさえもわかりません。

.

私がやりたいことを理解していただき、私を助けていただけることを願っています。

前もって感謝します!

4

5 に答える 5

2

Projection([x1, y1]) = [px1, py1] , Projection([x2, y2]) = [px2, py2], Projection([x3, y3]) のようにポイントを変換できる関数 Projection があります。 = [px3、py3]。私の理解が正しければ、作者は [x4, y4] を [px4, py4] に変換できるように、この射影関数を見つける方法を知りたがっています。

ここでは平面を扱っているため、射影関数は次のようになります。

Proj([ix, iy]) :
    return [ax*ix + bx*iy + cx,
            ay*iy + by*iy + cy];

これを使用して、2 つの方程式系を作成して解くことができます。

最初のもの
x1 * ax + y1 * bx + cx = px1
x2 * ax + y2 * bx + cx = px2
x3 * ax + y3 * bx + cx = px3

axbx、およびcxを解くと、

ax = (px1 * (y3 - y2) - px2*y3 + px3*y2 + (px2 - px3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
bx = - (px1 * (x3 - x2) - px2*x3 + px3*x2 + (px2 - px3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cx = (px1 * (x3*y2 - x2*y3) + x1 * (px2*y3 - px3*y2) + (px3*x2 - px2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

2 つ目 x1 * ay + y1 * by + cy = py1
x2 * ay + y2 * by + cy = py2
x3 * ay + y3 * by + cy = py3

aybycyを解くと、

ay = (py1 * (y3 - y2) - py2*y3 + py3*y2 + (py2 - py3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
by = - (py1 * (x3 - x2) - py2*x3 + py3*x2 + (py2 - py3) * x1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)
cy = (py1 * (x3*y2 - x2*y3) + x1 * (py2*y3 - py3*y2) + (py3*x2 - py2*x3) * y1) /
     (x1 * (y3 - y2) - x2*y3 + x3*y2 + (x2 - x3) * y1)

注:このツールを使用して方程式系を解きました。

于 2009-07-04T14:22:41.107 に答える
1

ホモグラフィック関数同次座標を使用する必要があります。これらは一般に 3D 透視操作に使用されます。

于 2009-07-02T13:19:37.057 に答える
1

書く

(x4,y4,1) = A1*(x1,y1,1) + A2*(x2,y2,1) + A3*(x3,y3,1),

A1、A2、A3の解。それで

(xp4,yp4) = A1*(px1,py1) + A2*(px2,py2) + A3*(px3,py3).

1回目の編集。

(A1,A2,A3) は線形システム Mat*(A1,A2,A3)=(x4,y4,1) の解です。

      ( x1  x2  x3 )
Mat = ( y1  y2  y3 )
      (  1   1   1 )

これは、さまざまな方法で解決できます。たとえば、Cramer のルールを使用します。

2回目の編集。

挿入した 1 は Z 座標ではなく、入力座標 (ユークリッド座標でなければなりません) の同次拡張です。(A1,A2,A3) は、三角形の頂点によって形成される基底の同次座標です。

3回目の編集。

3D 平面と投影平面の対応は、射影変換です。これは、入力平面 (x,y,1) (座標系) の同次座標で動作し、投影平面で座標 (u,v,t) を生成する 3x3 行列 T として定義できます。次に、px=u/t および py=v/t です。

ある点が入力平面の 3 点 (同じ直線上にない) によって形成される基底に同次座標 (A1、A2、A3) を持つ場合、その射影は射影基底に同じ同次座標を持ちます。

1 時間前には非常に明確に思えましたが、今は疑い始めています。問題の単一の解決策を得るには、追加のポイントのペアが 1 つ必要であることを知っている可能性があります...それが見つかった場合は、 JG Semple と GT Kneebone による著書「Algebraic Projective Geometry」。

于 2009-07-02T12:23:15.937 に答える
0

ここでは「少し」遅れていますが、最高評価の回答では、問題の 3D 空間が考慮されていません。平面上の 3 点 (実際には任意の 3D 点) が (射影幾何学のように) カメラの表面に投影される透視投影の問題があります。

この問題に明確な解決策を与えることはできません (複数の解決策が存在します)。3 つの 3D ポイントとそれぞれの 2D 透視投影が与えられたときにカメラの位置とポーズを見つける一般的な問題は、元のRANSAC 論文の P3P (Perspective-3-Point) アルゴリズムを使用して解決できます。カメラの前のポイント)。

カメラの姿勢が与えられた場合、追加の平面点の投影を計算するのは簡単です。

于 2012-10-08T14:37:00.470 に答える