この種の問題を解決するために使用されるアルゴリズムの概要を説明します。まず、カメラの物理的特性、つまり焦点距離と実際の画像サイズ、およびピクセル単位のサイズを知る必要があります。画像の「実際の」サイズとは、実際には画像のサイズ(または、想像しやすいかもしれませんが、従来のフィルム カメラのネガのサイズ) を意味します。航空マッピング用の典型的な中判カメラの例の値は、焦点距離 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: 地上での結果の位置。アルゴリズムを単純化したので、必要に応じて調整する必要があるかもしれません。
地形が平坦でない場合、問題はさらに複雑になります。画像全体を地面に投影する必要がある場合は、通常は逆の方法を使用します。これは、補間がより簡単で、並行して実行できるためです。
「仮想」画像が何を意味するのか正確にはわかりません。それらも投影によって作成されるため、使用できる理論的な画像パラメーターがいくつか存在します。