5

OpenCV はアルファチャンネルをサポートしていますか? または、透過pngを操作する方法はありますか? 2 つの画像をマージする必要があります。最初の画像は背景で、2 番目の画像は cvWarpAffine によって回転された画像です。これを行うには、ピクセルを 1 つずつマージし、cvWarpAffine の cvScalar で設定した値を持つピクセルを省略します。ただし、これは意図した解決策ではないと思います。提案をありがとう

4

3 に答える 3

8

更新された回答:フラグを使用CV_LOAD_IMAGE_UNCHANGEDして、イメージから 4 つのチャネル (アルファを含む) すべてをロードします。次に、mixChannels()and/orを使用split()してアルファ チャンネルを他のチャンネルから分離し、以下で説明するようにしきい値を設定します。

非常に古い答え:

OpenCV はアルファ チャネルをサポートせず、マスキングのみをサポートします。アルファ付きの PNG を読み込みたい場合は、最初に imagemagick を使用してアルファ チャネルを抽出します。

convert input.png -channel Alpha -negate -separate input-mask.png

次に、OpenCV では、次のように sth を実行できます。

Mat_<float> mask = imread("input-mask.png", 0);
threshold(mask, mask, 254., 1., THRESH_BINARY);

...実際のマスクを取得します (OpenCV 操作でマスク マトリックスとして使用できます)。または、しきい値を設定せずに独自の操作で使用できます。マスクを適用するには、3 つのチャネルに拡張することもお勧めします。

std::vector<Mat> marr(3, mask);
Mat_<Vec<float, 3> > maskRGB;
merge(marr, maskRGB);

その後、次のようにテストできます。

imshow("Target", target);
imshow("Mask", mask*255);
imshow("Applied", target.mul(maskRGB));
waitKey();

注:これは OpenCV 2.0 コードです。

于 2010-01-21T17:36:48.083 に答える
2

これは私が一緒に投げたbashスクリプトで、ディレクトリ内のすべてのpngファイルに対してypnosによって与えられたImageMagick変換を実行します。3行目の*をfindコマンドに置き換えることで、再帰的にすることができます。

#!/bin/bash

for file in *
do
    if [[ $file =~ (.+)-mask\.png ]]; then
        echo "Ignoring mask $file"
    elif [[ $file =~ (.+)\.png ]]; then
        echo "Generating mask for $file"
        basefn=${BASH_REMATCH[1]}
        convert "$basefn.png" -channel Alpha -negate -separate "$basefn-mask.png"
    fi
done
于 2010-11-13T22:05:26.963 に答える