10

ちょっと数学オタク、私はしばらくの間私を困惑させている問題を抱えています。個人的なプロジェクトです。

赤、緑、青の3つのドットがあります。それらは、赤い点が左下(0,0)にあり、青い点が右下(1,0)にあり、緑の点が左上にあるように、段ボールの伝票に配置されています。一歩下がって、ある角度からカードの写真を撮ることを想像してみてください。画像内の各ドットの中心を見つける場合(たとえば、単位がピクセルである場合)、画像内のカードの顔の法線ベクトル(カメラに対する)をどのように見つけますか?

今、私がこの問題について取り上げたいくつかのこと:

  1. (「実生活」での)ドットは常に直角です。写真では、カメラが「軸」(軸は赤と青または赤と緑の点によって作成された線)に沿って赤い点の周りを回転している場合にのみ直角になります。
  2. カードの片面だけにドットがあります。したがって、あなたはそれの後ろを見ることは決してないだろうということを知っています。
  3. カードからカメラまでの距離は関係ありません。各ポイントの深さを知っていれば、これははるかに簡単になります(単純な外積ですよね?)。
  4. カードの回転は、私が探しているものとは無関係です。これを理解するために私が行ってきたいじくり回しでは、最終的に法線ベクトルの助けを借りて回転を見つけることができます。回転が法線ベクトルを見つけることの一部(またはその積)であるかどうかは私にはわかりません。

これを行ったか、数学の天才である誰かがそこにいることを願っています。ここに2人の友人がいて、私を助けてくれましたが、これまでのところ、成功していません。

4

6 に答える 6

16

私は古いバージョンのMathCADでそれを解決しました:

代替テキスト

編集:MathCADのスクリーンショットの間違った言い回し:「既知:gb互いに垂直です」

MathCADで、クロス積を実行する最後のステップを忘れました。これは、以前の回答からコピーして貼り付けます。

これで、平行移動されたg点とb点のXYZが解決されました。元の質問では、平面の法線が必要でした。

g x bを横切ると、両方に垂直なベクトルが得られます。

        | u1  u2  u3 |
g x b = | g1  g2  g3 |
        | b1  b2  b3 |  

      = (g2b3 - b2g3)u1 + (b1g3 - b3g1)u2 + (g1b2 - b1g2)u3

すべての値がわかっているので、それらを接続します(g3とb3が置き換えられたバージョンは長すぎて醜いので、書きません。

しかし、実際には、条件に最も合うようにgzbz調整して、数値的に解く必要があると思います。

gb = 0

| g | = | b |

ピクセルは代数的に完全ではないので。

コマンドモジュールの正方形の水酸化リチウムキャニスターの1つをLEMで動作させるために装備しているアポロ13号の宇宙飛行士の写真を使用して、私は角を見つけました。

代替テキスト

それらをXY平面の基礎として使用する:

代替テキスト

Photoshopを使用して、ピクセルの位置を記録しました。正のXを右に、正のYを下に(Zの右手の法則を画像に「入れる」ため)。

g =(79.5、-48.5、g z

b =(-110.8、-62.8、b z

2つの開始式をExcelにパンチし、分析ツールパックを使用してgzとbzを調整することでエラーを「最小すると2つのZ値が得られました

g =(79.5、-48.5、102.5)

b =(-110.8、-62.8、56.2)

次に、他の興味深い値を計算できます。

ピクセル単位のgbの長さ:

| g | = 138.5

| b | = 139.2

法線ベクトル:

g x b =(3710、-15827、-10366)

単位法線(長さ1):

u N =(0.1925、-0.8209、-0.5377)

gおよびb(138.9)と同じ長さ(ピクセル単位)に垂直にスケーリング:

通常=(26.7、-114.0、-74.7)

これで、 gおよびbと同じ長さの法線が得られたので、それらを同じ画像にプロットしました。

代替テキスト

私はあなたが新しい問題を抱えていると思います:カメラのレンズによってもたらされる歪み。3つのドットは、2次元の写真面に完全には投影されていません。球形の歪みがあり、直線が真っ直ぐでなくなり、同じ長さが等しくなくなり、法線が法線からわずかに外れます。

Microsoft Researchには、カメラの歪みを修正する方法を理解するためのアルゴリズムがあります。

カメラキャリブレーションのための柔軟な新技術

しかし、それは私を超えています:

カメラのキャリブレーションを容易にする柔軟な新技術を提案します。3Dジオメトリやコンピュータビジョンの専門知識がなくても使用するのに適しています。この手法では、カメラがいくつか(少なくとも2つ)の異なる方向で表示される平面パターンを観察するだけで済みます。カメラまたは平面パターンのいずれかを自由に動かすことができます。動きを知る必要はありません。ラジアルレンズ歪みがモデル化されています。提案された手順は、閉形式の解と、それに続く最尤基準に基づく非線形の改良で構成されます。コンピュータシミュレーションと実際のデータの両方が提案された技術をテストするために使用され、非常に良い結果が得られました。2つまたは3つの直交平面などの高価な機器を使用する従来の手法と比較して、提案された手法は使いやすく、柔軟性があります。

サンプル画像があり、歪みを確認できます。

代替テキスト
(ソース:microsoft.com

ノート

  • 段ボールの「上部」が表示されているのか、「下部」が表示されているのかわからないため、法線は垂直方向にミラーリングできます(つまり、z = -z)

アップデート

ガイは、導出された代数式に誤りを見つけました。それを修正すると、私は単純な閉じた形をしているとは思わない式になります。とにかく正確に解決することはできないので、これはそれほど悪くはありません。しかし、数値的に。

これがExcelのスクリーンショットで、2つの既知のルールから始めます。

gb = 0

| g | = | b |

2番目の値を差(「エラー」量)として書き込むと、両方を合計し、その値を数値として使用して、Excelのソルバーを最小化できます。

代替テキスト

これは、独自の数値反復ソルバーを作成する必要があることを意味します。大学のNumericalMethodsforEngineersの教科書を見つめています。単純な閉じた形を使わずに漸化式を解くアルゴリズムが含まれていることを私は知っています。

于 2010-01-14T22:32:22.150 に答える
2

その音から、平面を定義する3つの点p 1p 2、およびp 3があり、平面の法線ベクトルを見つけたいと考えています。

点を原点からのベクトルとして表すと、法線ベクトルの方程式は次のようになります
。n =(p 2 - p 1)x(p 3 - p 1
(xは2つのベクトルの外積)

ベクトルをカードの前面から外側に向ける場合は、右手の法則として、
p 1 =赤(左下)のドット
p 2 =青(右下)のドット
p 3 =緑(上)を設定します。 -左)ドット

于 2010-01-10T01:41:26.503 に答える
2

@ Ian Boyd ...私はあなたの説明が好きでした、あなたがb zを解くと言ったとき、私だけがステップ2で立ち往生しました。あなたはまだあなたの答えにbzを持っていました、そして私はあなたがあなたの答えにbz持っているべきではないと思います...

bzはgx2 + g y 2 + g z 2-b x 2 - by2+/-平方根ある必要あります

これを自分で行った後、g zを解くときに、最初の方程式にb zを代入するのは非常に難しいことがわかりました。これは、b zを代入すると、次のようになるためです。

g z =-(g x b x + g y b y)/ sqrt(g x 2 + g y 2 + g z 2 -b x 2 -b y 2

これを難しくしているのは、平方根にg zがあるので、それを分離してg zを結合し、私が行ったgzを解く必要があるということです正解でした。なぜなら、私がg zを計算するプログラムを作成したとき、あなたのg xgyのを使用して、私の答えがあなたの答えと一致するかどうかを確認しましたが、一致しませんでした。

ですから、私のプロジェクトの1つでこれを機能させる必要があるので、私を助けてくれないかと思っていました。ありがとう!

于 2010-09-14T21:41:09.260 に答える
1

ここで私の足で考えているだけです。

効果的な入力は、見かけの比率RB / RG [+]、見かけの角度BRG、および(たとえば)RBが画面座標のy軸となす角度です(何か見落としましたか)。正規化された正規(heh!)ベクトルのコンポーネントが必要です。これは、2つの独立した値にすぎないと思います(ただし、カードが透けて見える場合は、前後のあいまいさが残ります)。[++]

だから、これは可能だと思います...

ここからは、RBの見かけの角度が常に0であると仮定して作業します。後で、最終的な解をz軸を中心に回転させることができます。

カードを表示面に平行に配置し、「自然な」方向に向けます(つまり、上と下、左と右の割り当てが尊重されます)。\theta最初のx軸(の場合-\pi/2 < \theta < \pi/2)を中心に回転し、次に\phi最初のy軸(の場合)を中心に回転することで、カードのすべての興味深い位置に到達できます-\pi/2 < \phi < \pi/2。RBベクトルの見かけの方向を保持していることに注意してください。

\theta次のステップでは、との観点から見かけの比率と見かけの角度を計算し\phi、結果を反転します。[+++]

法線はR_y(\phi)R_x(\theta)(0, 0, 1)R_i軸の周りのプリミティブ回転行列になりますi

[+]絶対的な長さはカウントされません。これは、カードまでの距離を示しているだけだからです。

[++]もう1つの仮定:カードからビュープレーンまでの距離は、カードのサイズよりもはるかに大きいということです。

[+++]ここでは、3次元空間から表示平面への投影が重要です。これは難しい部分ですが、使用しているプロジェクションを言わない限り、私たちができることではありません。実際のカメラを使用している場合、これは透視投影であり、基本的に3Dグラフィックスに関するすべての本でカバーされています。

于 2010-01-10T03:55:34.583 に答える
0

u、v、nco-oridnatesを使用できます。視点を「目」または「カメラ」の位置に設定してから、x、y、z座標をu、v、nに変換します。そこから、法線だけでなく、必要に応じて遠近法と可視面を決定できます(u'、v'、n')。また、2D = 3D、z=0であることに注意してください。最後に、均質な座標を使用していることを確認してください。

于 2010-01-21T05:35:59.457 に答える
0

右、法線ベクトルは距離によって変化しませんが、画像上の段ボールの投影は距離によって変化します(単純:小さな段ボールを使用している場合は何も変更されません。幅1マイル、高さ1マイルの段ボールを使用している場合写真では、片側が近く、反対側が遠くなるように回転させると、手前側が拡大され、反対側が短くなります。すぐに、長方形は長方形ではなく、台紙のままであることがわかります。

小さな角度と中央を中心とするカメラの最も正確な方法は、「通常の」画像と中央の線の角度画像の間の幅/高さの比率を測定することです(歪んでいないため)。

xを左から右、yを下から上、zを遠から近くと定義します。

次に、
x = arcsin(measuredWidth / normWidth)red-blue
y = arcsin(measuredHeight / normHeight)red-green
z = sqrt(1.0-x ^ 2-y ^ 2)

明日はもっと正確な解を計算しますが、今は疲れすぎています...

于 2010-01-10T02:19:28.257 に答える