Sanzhar:
私は、アルファチャンネル付きのビデオを持っていると私は次のように別の映像の上に配置しようとしています:
public static void overlayImage(Mat background, Mat foreground, Mat output, Point location) {
background.copyTo(output);
for (int y = (int) Math.max(location.y, 0); y < background.rows(); ++y) {
int fY = (int) (y - location.y);
if (fY >= foreground.rows()) {
break;
}
for (int x = (int) Math.max(location.x, 0); x < background.cols(); ++x) {
int fX = (int) (x - location.x);
if (fX >= foreground.cols()) {
break;
}
double opacity;
double[] finalPixelValue = new double[4];
opacity = foreground.get(fY, fX)[3];
finalPixelValue[0] = background.get(y, x)[0];
finalPixelValue[1] = background.get(y, x)[1];
finalPixelValue[2] = background.get(y, x)[2];
finalPixelValue[3] = background.get(y, x)[3];
for (int c = 0; c < output.channels(); ++c) {
if (opacity > 0) {
double foregroundPx = foreground.get(fY, fX)[c];
double backgroundPx = background.get(y, x)[c];
float fOpacity = (float) (opacity / 255);
finalPixelValue[c] = ((backgroundPx * (1.0 - fOpacity)) + (foregroundPx * fOpacity));
if (c == 3) {
finalPixelValue[c] = foreground.get(fY, fX)[3];
}
}
}
output.put(y, x, finalPixelValue);
}
}
}
私はこの機能を実行すると、明らかにこのようVideoCaptureから取られているマットを前景ので、私がnullpointer例外を取得します:
capture.grab() && capture.retrieve(foregroundMat, -1);
のみRGB画像を取得し、アルファチャネルを除去します。ビデオファイルは、もともと完全に罰金であり、それはマットを取り出したRGBA形式にする必要がありますが、そうではありません。何がこの問題の理由かもしれませんか?
ウェルビーイング:
残念ながら、OpenCVのは、アルファチャンネルでビデオフレームをフェッチサポートしていません。これは、このことから明らかであるコードスニペット。著者は、便利なビデオファイルは常にRGBフレームを持っているであろうと想定しています。
迅速なハックを交換することができAV_PIX_FMT_BGR24
てAV_PIX_FMT_BGRA
、関連する場所(2-3インスタンス)で、あなたのコードの作業を取得するためのライブラリを再構築します。しかし、この汚いハックは常に、すべてのビデオフォーマットのためのRGBAフレームを生成します。
私は個人的に作成するために計画していますこの修正プログラムをPRするが、それはしばらく時間がかかることがあります。
他の可能な解決策は、フレームのフェッチするためにいくつかの他のサードパーティのライブラリを使用することであろう.webm
か、.mov
フォーマットをしてからOpenCVのを使用して、それを処理します。