画像を歪ませるツールで作業していますが、歪みの目的は画像を球面スクリーンに投影することです。希望する出力は次のようになります。画像歪みの高速アルゴリズム
私が使用するコードは、次のとおりです。 - 宛先領域内のすべての点(x、y)について、元の画像の対応するピクセル(sourceX、sourceY)を取得します。
しかし、私のテストでは、sunset.jpg(800 * 600)の処理には1500ms以上が必要です。数学的/三角法による計算を削除すると、cvGet2DとcvSet2Dだけを呼び出すと1200ms以上必要です。
これを行うより良い方法はありますか? Emue CV(OpenCVの.NETラッパーライブラリ)を使用していますが、他の言語の例もOKです。
private static void DistortSingleImage()
{
System.Diagnostics.Stopwatch stopWatch = System.Diagnostics.Stopwatch.StartNew();
using (Image<Bgr, Byte> origImage = new Image<Bgr, Byte>("sunset.jpg"))
{
int frameH = origImage.Height;
using (Image<Bgr, Byte> distortImage = new Image<Bgr, Byte>(2 * frameH, 2 * frameH))
{
MCvScalar pixel;
for (int x = 0; x < 2 * frameH; x++)
{
for (int y = 0; y < 2 * frameH; y++)
{
if (x == frameH && y == frameH) continue;
int x1 = x - frameH;
int y1 = y - frameH;
if (x1 * x1 + y1 * y1 < frameH * frameH)
{
double radius = Math.Sqrt(x1 * x1 + y1 * y1);
double theta = Math.Acos(x1/radius);
int sourceX = (int)(theta * (origImage.Width - 1)/Math.PI);
int sourceY = (int)radius;
pixel = CvInvoke.cvGet2D(origImage.Ptr, sourceY, sourceX);
CvInvoke.cvSet2D(distortImage, y, x, pixel);
}
}
}
distortImage.Save("Distort.jpg");
}
Console.WriteLine(stopWatch.ElapsedMilliseconds);
}
}
画像が左右対称であるので、ほとんど忘れてしまったので、処理時間を半分に短縮するために左の部分だけを処理して右にコピーできますが、これでは十分ではありません。 – kennyzx