OpenCV はアルファチャンネルをサポートしていますか? または、透過pngを操作する方法はありますか? 2 つの画像をマージする必要があります。最初の画像は背景で、2 番目の画像は cvWarpAffine によって回転された画像です。これを行うには、ピクセルを 1 つずつマージし、cvWarpAffine の cvScalar で設定した値を持つピクセルを省略します。ただし、これは意図した解決策ではないと思います。提案をありがとう
3 に答える
更新された回答:フラグを使用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 コードです。
これは私が一緒に投げた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