2

私はこの問題を抱えており、頭の中で複雑にしすぎている可能性があります。私は長い間それに取り組んできましたが、誰かが私に方向性を教えていただければ幸いです。

だから私がやろうとしているのは、空から撮った画像の座標を、地面の平らな面の座標にマッピングすることです。これはポイントの真上からでも問題ありません。基本的な三角法を使用して計算された係数で座標をスケーリングできます。

問題は、カメラが斜めにあった場合です。

http://i61.tinypic.com/359wsok.png [注、高さはここでは Z 軸]

私の図が理にかなっていることを願っています。中心線 ((x2,y2) で終わる線は、他の 2 本の線を二等分します。つまり、外側の線のそれぞれは、中心線から (1/2) 度です。これは非常に複雑になる可能性があることを理解しています。より水平になるほどこれは明らかに、画像の最も離れた部分にある 2 つのピクセル間の距離が、「拡大」された近くのピクセル間の距離よりも大きいことを意味します。垂直からわずか 40 度の角度でも十分に機能するものを管理できれば、それは素晴らしいことです。

私の最初の試みは、表示されている表面のサイズを取得し、それを使用して座標をスケーリングすることでした。しかし、私はこれがうまくいったとは思わない。(x2,y2) は、キャプチャされたサーフェスの中心にない可能性があり、キャプチャされたサーフェスが真下にないため、座標に追加する必要があるある種のオフセットもあります。

それがすべて明確だったことを願っています。さらに情報が必要な場合は、お知らせください。少しだけぐるぐる回っています。

ありがとう

4

1 に答える 1

1

この種の問題を解決するために使用されるアルゴリズムの概要を説明します。まず、カメラの物理的特性、つまり焦点距離と実際の画像サイズ、およびピクセル単位のサイズを知る必要があります。画像の「実際の」サイズとは、実際には画像のサイズ(または、想像しやすいかもしれませんが、従来のフィルム カメラのネガのサイズ) を意味します。航空マッピング用の典型的な中判カメラの例の値は、焦点距離 50mm、9000*6800 ピクセル、ピクセル サイズ 6 ミクロンで、画像サイズは ~40x54mm になります。

地上の 1 つのピクセルの位置を計算するアルゴリズムは次のとおりです (LSR システムを使用するように適合されており、地理座標でも同様に行うことができます)。

public void ImageToGround(Camera sensor, double posx, double posy, double posz, 
    double dDeltaX, double dDeltaY, 
    Matrix4D rotationMatrixItg, 
    double groundheight, out double resultx, out double resultx)
    {
        // The rotation matrix is right-handed, with x pointing in flight direction, y to the right and z down.
        // The image cs is increasing x to the right and y to the bottom (y = 0 is front in flight direction)
        Vector3D imagePointRelativeToFocalPoint = new Vector3D(
             dDeltaX,
             dDeltaY,
             -sensor.MetricFocalLength);

         // Transform from img to camera coord system and rotate.
         // The rotation Matrix contains the transformation from image coordinate system to camera
         // coordinate system. 
         Vector3D imagePointRotated = rotationMatrixItg * imagePointRelativeToFocalPoint;

         double dir, dist;

         // Create a horizontal plane at groundheight, pointing upwards. (Z still points down)
         Plane plane = new Plane(new Vector3D(0, 0, -1), new Vector3D(0, 0, -groundheight));

         // And a ray, starting at the given image point (including the real height of the image position).
         // Direction is opposite to the vector given above (from image to focal point). 
         Ray start = new Ray(new Vector3D(imagePointRotated.X, imagePointRotated.Y, imagePointRotated.Z - evHASL), 
    -(new Vector3D(imagePointRotated.X, imagePointRotated.Y, imagePointRotated.Z)));

         // Find the point where the ray intersects the plane (this is on the opposite side of the
         // x and y axes, because the ray goes trough the origin). 
         IntersectionPair p = start.Intersects(plane);
         if (p.NumIntersections < 1)
         {
             resultx = 0;
             resulty = 0;
             return;
         }

         resultx = p.Intersection1.x;
         resulty = p.Intersection1.y;

   }

with posx, posy, posz: 画像の中心の位置。dDeltaX、dDeltaY: 焦点面上のピクセルの位置 (メートル単位)。rotationMatrixItg: 画像のヨー、ピッチ、ロールから作成された、画像から地面への回転行列。地面の高さ: 地面の標高。resultx、resulty: 地上での結果の位置。アルゴリズムを単純化したので、必要に応じて調整する必要があるかもしれません。

地形が平坦でない場合、問題はさらに複雑になります。画像全体を地面に投影する必要がある場合は、通常は逆の方法を使用します。これは、補間がより簡単で、並行して実行できるためです。

「仮想」画像が何を意味するのか正確にはわかりません。それらも投影によって作成されるため、使用できる理論的な画像パラメーターがいくつか存在します。

于 2014-03-23T11:13:35.603 に答える