0

EmguCVビットマップマトリックスを反復してピクセルを設定する最速の方法が必要です。私はグーグルの後にこれを見つけましたが、700x500の画像には約3秒かかります:

ドキュメントによると、アクセス(取得)データマトリックスはo(1)にすぎませんが、セットデータについて明確に宣言されていません。



    for(int i = 0; i < img.Rows ; i++)

        for(int j = 0; j < img.Cols; j++){

            img.Data[x,y,0] = 255;

            img.Data[x,y,1] = 255;

            img.Data[x,y,2] = 255;

        }


前もって感謝します。

4

4 に答える 4

3

Emgu.CV.Image<>のプロパティのゲッターはData、クラスによって内部的に使用される 3 次元配列への参照を返します。その配列の要素に割り当てる場合 (上記のコードで行っているように)、Dataプロパティのセッターを呼び出すのではなく、配列自体を操作しています。

EmguCV コードは大部分がアンマネージであるため、発生しているスローダウンはアンマネージ コードの呼び出しに関連していると思われます。

これを試して、速度に変化があるかどうかを確認してください。

Byte[,,] data = img.Data;
int rows = img.Rows;
int cols = img.Cols;

for (int y = 0; y < rows; ++i)
{
    for (int x = 0; x < cols; ++x)
    {
        data[x, y, 0] = 255;
        data[x, y, 1] = 255;
        data[x, y, 2] = 255;
    }
}

また、このImageクラスには、SetValueすべてのピクセルを特定の値に設定するメソッドがあります。達成しようとしているのが画像を白くクリアすることである場合はimg.SetValue(new Rgb(255,255,255))、手動で行うのではなく、呼び出し (または画像に使用している色の種類) を試してください。より速いかもしれません。

于 2013-02-23T21:55:52.293 に答える
1

安全または安全でない方法を使用して、ビットマップに変換Emgu.Cv.Imageして反復処理する方がはるかに高速です。System.Drawing.Bitmap

  • 安全な方法は

    color.toargb = bmp.getpixel(X, Y).toargb / bmp.setpixel(X, Y).toargb 
    

    そしてそれはかなり簡単です。

  • 安全でない方法は超高速で、依存してbmp.lockbits(bmp_data)bmpinteropservices.marshalデータを配列にコピーします。オンラインでたくさんの例を見つけることができます。

EmguCV 3.0 ピクセル アクセスには非常に失望しています。

于 2016-01-24T22:27:39.850 に答える
1
for (int y = 0; y < rows; y++)
{
    for (int x = 0; x < cols; x++)
    {
        b = (int)frameClone.Data[y, x, 0];
        g = (int)frameClone.Data[y, x, 1];
        r = (int)frameClone.Data[y, x, 2];
    }

    currIntensity = b + g + r;
}
于 2014-11-17T02:44:59.593 に答える