10

正方形を台形に変換することは線形変換であり、射影行列を使用して実行できることは知っていますが、行列の作成方法を理解するのに少し問題があります。

射影行列を使用して、平行移動、スケーリング、回転、およびせん断を行うのは簡単です。正方形を台形に変換する単純な射影行列はありますか?

4

3 に答える 3

11

a、b、c、dは、2D正方形の四隅です。

a、b、c、dは同次座標で表されるため、3x1行列です。

アルファ、ベータ、ガンマ、デルタは、2D台形の四隅です。

アルファ、ベータ、ガンマ、デルタは同次座標で表されるため、3x1行列です。

Hはあなたが探している3x3行列であり、ホモグラフィとも呼ばれます

    h1 h2 h3
H = h4 h5 h6
    h7 h8 h9

Hはa、b、c、dをアルファ、ベータ、ガンマ、デルタにマッピングするため、次の4つの方程式が得られます。

alpha=H*a
beta=H*b
gamma=H*c
delta=H*d

a、b、c、dとアルファ、ベータ、ガンマ、デルタを知っていると仮定すると、9つの未知数h1、h2、h3、h4、h5、h6、h7、h8、h9について前の4つの方程式系を解くことができます。

ここでは、問題の「生の」解決策について説明しました。これは、原則として機能します。上記の方法の詳細な説明については、たとえばこのページhttp://www.corrmap.com/features/homography_transformation.phpを参照してh9=1H8つのパラメーターで表現できるため)、線形システムを解くことができます。 8つの未知数の8つの方程式の。同様の説明は、ElanDubrofskyによる論文ホモグラフィ推定のセクション2にあります。

もう1つの説明は、AMSのFeatureColumnの2013年3月号に掲載されたDavidAustinによる射影幾何学を使用したカメラの修正です。

上記の方法は、欠点もありますが、RichardHartleyとAndrewZissermannによるコンピュータービジョンのマルチビュージオメトリの第2版の第4章「推定-2D射影変換」で説明されています。同じ本をたどっているように見えるこのリンクhttp://www.cse.iitd.ac.in/~suban/vision/geometry/node24.htmlを確認できます。

ホモグラフィの別の説明は、 Simon JD Princeによる著書ComputerVision:Models、Learning、 andInferenceのセクション15.1.4「Projectivetransformationmodel」にあります。アルゴリズムアルゴリズム15.4:射影変換(ホモグラフィ)の最尤学習は、彼のアルゴリズムの小冊子に概説されています:問題は非線形最小化によって解決されます。

于 2011-07-02T08:01:46.230 に答える
3

多分あなたは四辺形を使うことができますか?ここで私の答えを参照してください:

https://stackoverflow.com/a/12820877/202451

そうすれば、各ポイントを完全に制御でき、四隅の形状を簡単に作成できます。:)

于 2012-10-10T13:54:49.413 に答える
0

最小限の依存関係を持つJava実装

知識と時間が限られていて、迅速で汚い解決策を探している人のために、Wii-interactプロジェクトには実用的で非常に信頼性の高いJava実装があります。

変換は、ホモグラフィのソースファイルにあります。要約すると、マトリックスの構築と解決になります。

/**
* Please note that Dr. John Zelle assisted us in developing the code to
* handle the matrices involved in solving for the homography mapping.
* 
**/
Matrix A = new Matrix(new double[][]{
                {x1, y1, 1, 0,  0,  0, -xp1*x1, -xp1*y1},
                {0,  0,  0, x1, y1, 1, -yp1*x1, -yp1*y1},
                {x2, y2, 1, 0,  0,  0, -xp2*x2, -xp2*y2},
                {0,  0,  0, x2, y2, 1, -yp2*x2, -yp2*y2},
                {x3, y3, 1, 0,  0,  0, -xp3*x3, -xp3*y3},
                {0,  0,  0, x3, y3, 1, -yp3*x3, -yp3*y3},
                {x4, y4, 1, 0,  0,  0, -xp4*x4, -xp4*y4},
                {0,  0,  0, x4, y4, 1, -yp4*x4, -yp4*y4}
        });

        Matrix XP = new Matrix(new double[][]
                          {{xp1}, {yp1}, {xp2}, {yp2}, {xp3}, {yp3}, {xp4}, {yp4}});
        Matrix P = A.solve(XP);
        transformation = new Matrix(new double[][]{
                {P.get(0, 0), P.get(1, 0), P.get(2,0)},
                {P.get(3, 0), P.get(4, 0), P.get(5,0)},
                {P.get(6, 0), P.get(7, 0), 1}
        });

使用法:次のメソッドが最終的な変換を行います。

public Point2D.Double transform(Point2D.Double point) {
    Matrix p = new Matrix(new double[][]{{point.getX()}, {point.getY()}, {1}});
    Matrix result = transformation.times(p);
    double z = result.get(2, 0);
    return new Point2D.Double(result.get(0, 0) / z, result.get(1, 0) / z);
}

クラスの依存関係はJAMA:JavaMatrixPackageMatrixに由来します

ライセンス

  1. Wii- GNUGPLv3と相互作用する
  2. JAMAパブリックドメイン
于 2014-01-03T11:08:14.103 に答える