0

Canon EOS SDK を使用しており、カメラ ストリームでライブ グリーンスクリーンを実現したいと考えています。

ピクセル操作を最適化した単純なグリーンスクリーン アルゴリズムがあります。

 public Bitmap greenScreen(Bitmap input, int tolerance)
        {
            FastPixel fpinput = new FastPixel(input);
            fpinput.Lock();

            Bitmap output = new Bitmap(input.Width, input.Height);
            FastPixel fpoutput = new FastPixel(output);
            fpoutput.Lock();

            for (int y = 0; y < output.Height; y++)
            {
                for (int x = 0; x < output.Width; x++)
                {
                    Color camColor = fpinput.GetPixel(x, y);

                    // Every component (red, green, and blue) can have a value from 0 to 255, so determine the extremes
                    byte max = Math.Max(Math.Max(camColor.R, camColor.G), camColor.B);
                    byte min = Math.Min(Math.Min(camColor.R, camColor.G), camColor.B);

                    bool replace =
                        camColor.G != min // green is not the smallest value
                        && (camColor.G == max // green is the bsiggest value
                        || max - camColor.G < 8) // or at least almost the biggest value
                        && (max - min) > tolerance; // minimum difference between smallest/biggest value (avoid grays)

                    if (!replace)
                        fpoutput.SetPixel(x, y, camColor);

                }
            }

            fpinput.Unlock(true);
            fpoutput.Unlock(true);

            return fpoutput.Bitmap;
        }

800x600 の写真の場合、私の i5 では約 300 ミリ秒かかります。もちろん、これはスムーズなライブストリームには十分な速度ではありません.

どのような最適化オプションがありますか? GPU関数を使用する機会はありますか? チャンスとは?Canon カメラで DirectShow を使用できません (ドライバーが存在しません)。

4

1 に答える 1

2
  1. GetPixel/SetPixel

    あなたの環境を知りません (私は C# でコーディングしていません) が、これらの関数はすべての環境で非常に遅くなる傾向があります。通常、次のようなビットマップの代替手段があります。

  2. 画像取得

    繰り返しますが、使用しているSDKも、必要なターゲット fps もわかりませんが、アプリだけでなく、 SDKストリーミングが遅い可能性があります。DirectShowは、30 fpsより低い解像度の周りを提供できます。ただし、解像度が大きいとVFWよりも遅くなりますが、ストリーミングやドライバー自体ではなく、USBに関連している可能性があることに気付きました。DirectShowドライバーを持っていないので、運が悪いです。VFWドライバーを入手した場合は、それを使用できますが、通常は最大でしか提供できません15 fpsが、コードは大幅に単純になり、CPUの要求が少なくなります。

    ところで、一部のドライバーにはストリーミング (または時間間隔) のfpsを設定する機能があるため、 SDKでそのような関数またはトークンを検索すると、デフォルトで低いfpsが設定されている可能性があります。

    また、別のUSBを使用してみてください(USB 接続が使用されている場合) 一部の USB は、他のデバイスによって帯域幅が既に奪われている可能性があります (理想的には、ルート HUB 全体で単一のカメラでテストします)。

どれが問題であるかを検出するには、ピクセルが転送または表示されていないときにfpsをカウントします(画像関連のコードをすべて削除し、偶数の発生のみを測定します)。取得が速い場合、ドライバーは問題ではありません。次に、転送を測定し、速度が遅すぎる場合は、そのコードも問題です。

于 2016-10-23T10:20:28.080 に答える