2

私は現在、EMGUを使用して変換を実装しようとしていますが、それがどのように機能するかについて頭を悩ませているようには見えません(オンラインの例はないようです)。

変換元 (および変換先) の 4 つのポイントを含むイメージを取得しましたが、他にどの変数が必要かはわかりませんが、「mapMat」を要求しますか?

これが私がこれまでに持っているものです:

        float[,] tmp = {
                            {bottomLeft.x, bottomLeft.y},
                            {topLeft.x, topLeft.y},
                            {topRight.x, topRight.y},
                            {bottomRight.x, bottomRight.y}
                       };
        Matrix<float> sourceMat = new Matrix<float>(tmp);
        float[,] target = {
                            {0, height},
                            {0, 0},
                            {width, 0},
                            {width, height}
                       };
        Matrix<float> targetMat = new Matrix<float>(target);
        //mapMat = just a placeholder matrix?
        Matrix<float> mapMat = new Matrix<float>(target);
        CvInvoke.cvGetAffineTransform(sourceMat.Ptr, targetMat.Ptr, mapMat.Ptr);

ただし、これは機能しません。また、アフィン変換が最も理想的なソリューションであるかどうかもわかりませんでした。FindHomography とパースペクティブ変換についても読みましたが、ここで適用されるかどうかはわかりません。

私が達成したいターゲット変換は次のようなものです:

http://img832.imageshack.us/img832/5157/targettransform.png

どんな助けでも大歓迎です、

ありがとう

4

1 に答える 1

4

最初に少し紹介します:

  • アフィン変換が必要な場合 (写真からわかるように)、推定するパラメーターが 6 つあるため、少なくとも 3 つのポイント ペアが必要です。
  • より一般的な変換、つまりホモグラフィが必要な場合は、推定するパラメーターが 8 つあるため、少なくとも 4 つのポイント ペアが必要です。

4 つのソース コーナーとデスティネーション コーナーがあり、パースペクティブ トランスフォーメーションを推定したい場合、このコードは次のように実行する必要があります。

PointF[] pts1 = new PointF[4];
PointF[] pts2 = new PointF[4];
HomographyMatrix homography;
for (int i = 0; i < 4; i++)
{
  pts1[i] = new PointF (sourceCorner[i].X, sourceCorner[i].Y);
  pts2[i] = new PointF (destCorner[i].X, destCorner[i].Y);
}
homography = CameraCalibration.GetPerspectiveTransform(pts1, pts2);

その他の便利な方法については、CameraCalibration をご覧ください。

于 2011-02-07T17:34:30.933 に答える