8

Emgu.CV を使用して、基本的な画像操作と構成を実行しています。私の画像はとしてロードされImage<Bgra,Byte>ます。

質問 #1:この方法を使用するImage<,>.Add()と、アルファ値に関係なく、画像が常にブレンドされます。代わりに、それらを重ねて合成し、含まれているアルファチャンネルを使用して画像をブレンドする方法を決定したいと思います。したがってimage1.Add(image2)、image2 の完全に不透明なピクセルを呼び出すと、image1 のピクセルが完全に覆われ、半透明のピクセルはアルファ値に基づいてブレンドされます。

これが私が視覚的な形でやろうとしていることです。いくつかの「透明な穴」が切り取られた都市のイメージと、後ろのカエルがあります。これは次のようになります。

ここに画像の説明を入力

そして、これがopenCVが生成するものです。

これは、呼び出し時に OpenCV (Emgu.CV) が生成するものです。

OpenCVでこの効果を得るにはどうすればよいですか? そして、それは電話するのと同じくらい速くなりAdd()ますか?

質問 #2:を呼び出すたびに新しいイメージを作成する代わりに、この構成をインプレースで実行する方法はありAdd()ますか? (たとえば、?image1.AddImageInPlace(image2)のバイトを変更します image1)

: Emgu.CV 内で回答を探しています。これは、パースペクティブ ワーピングをうまく処理するために使用しています。

4

4 に答える 4

6

OpenCV 2.4より前は、アルファチャネルを使用したPNGはサポートされていませんでした。

現在のバージョンでサポートされているかどうかを確認するには、画像を読み込んだ後、RGBAであることが確実なチャンネル数を印刷します。サポートされている場合、アプリケーションは数値4を出力し、そうでない場合は数値3(RGB)を出力します。C APIを使用すると、次のようになります。

IplImage* t_img = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);
if (!t_img)
{
    printf("!!! Unable to load transparent image.\n");
    return -1;
}
printf("Channels: %d\n", t_img->nChannels);

OpenCVを更新できない場合

お使いのバージョンがすでにRGBAを使用したPNGをサポートしている場合

編集:

私は最近この問題に対処しなければならなかった、そして私はこの答えでそれを扱う方法を示した。

于 2012-08-22T18:58:10.930 に答える
2

各ピクセルを反復処理する必要があります。画像 1 はカエルの画像で、画像 2 は都市の画像であり、画像 1 は常に画像 2 よりも大きいと想定しています。

//to simulate image1.AddInPlace(image2)
 int image2w = image2.Width;
 int image2h = image2.Height;
 int i,j;
 var alpha;
 for (i = 0; i < w; i++)
 {
     for (j = 0; j < h; j++)
     {
           //alpha=255 is opaque > image2 should be used
           alpha = image2[3][j,i].Intensity;
           image1[j, i] 
               = new Bgra(
               image2[j, i].Blue * alpha + (image1[j, i].Blue * (255-alpha)),
               image2[j, i].Green * alpha + (image1[j, i].Green * (255-alpha)),
               image2[j, i].Red * alpha + (image1[j, i].Red * (255-alpha)));
      }
 }
于 2012-08-21T07:00:04.777 に答える
0

インターネットで興味深いブログ投稿を見つけました。これは、あなたがやろうとしていることと関連していると思います。

オーバーレイの作成方法( archive.org リンク)をご覧ください。このアイデアを使用して、上記の方法で 2 つの画像を追加する独自の関数を実装し、画像の特定の領域を透明にし、残りをそのままにすることができます。

于 2012-08-18T17:19:50.847 に答える