1

私は EmguCV を使用しており、2 つの画像を減算して、AForge .NET のMoveTowardsフィルターに似たフィルターを作成しようとしています。

これは、上記の URL を少し変更したバージョンで実行しようとしていることです。ソースとオーバーレイの 2 つの画像を指定すると、ソース画像がオーバーレイに向かってゆっくりと移動します。これは、以下に基づいて行われます。

result = source + movementFactor * (overlay - source);

ここで、result、source、overlay は画像で、motionFactor は 0 から 1 の範囲の変化率です。

1 に等しい motionFactor を使用してコードでこれを試したところ、結果がめちゃくちゃに見えました (モーション トレイルのようなものがありました)。さらにテストするために、上記の式から MovementFactor を削除し、結果 = ソース + オーバーレイ - ソースにしました。結果としてオーバーレイ画像が表示されることを期待していましたが、実際に実行しましたが、画像の 1 つの領域が点滅していました。

加算/減算が行われると、ピクセル強度が上限または下限でクリップされると推測しています。

私はこれで私が望むことを達成することができます:

for (int i = 0; i < src.Height; i++)
{
    for (int j = 0; j < src.Width; j++)
    {
        res[i, j] = new Gray(src[i, j].Intensity + movementFactor * (ovr[i, j].Intensity - src[i, j].Intensity));
    }
}

ただし、これにより処理が大幅に遅くなります。上記の加減算の問題や速度の問題をどのように克服できますか?回答ありがとうございます。

4

2 に答える 2

2

誰かが将来同じ問題に遭遇した場合に備えて、ここで見つけた回答を投稿します。

これはあなたがそれを行う方法です:

Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result);

出典:EmguCVのフォーラム、これが私に返信をくれた投稿です

于 2009-11-13T14:47:31.670 に答える
1

誰かが将来同じ問題に遭遇した場合に備えて、ここで見つけた回答を投稿します。

これはあなたがそれを行う方法です:

Image<Gray,Byte> result = new Image<Gray,Byte>(source.Size);
CvInvoke.cvAddWeighted(source, 1.0-movementFactor, overlay, movementFactor, 0.0, result); 

出典:EmguCVのフォーラム、これが私に返信をくれた投稿です

そのためのよりクリーンな構文があることに注意してください。

var result = frame.AddWeighted(1.0 - movementFactor, overlay, movementFactor, 0.0);
于 2011-08-24T20:28:19.240 に答える