OpenCV VideoCapture从视频中删除Alpha通道

时间:2018-11-30 06:56:15

标签: java opencv video-capture rgba

我有一个带有Alpha频道的视频,我正尝试将其放在另一个视频上,如下所示:

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);
            }
        }
  }

运行此函数时,我得到了Nullpointer异常,因为显然是从VideoCapture中获取的前景Mat是这样的:

capture.grab() && capture.retrieve(foregroundMat, -1);

仅检索rgb图像并删除Alpha通道。 该视频文件本来就很好,并且它取回的文件应该是rgba格式,但事实并非如此。这个问题可能是什么原因?

1 个答案:

答案 0 :(得分:1)

不幸的是,OpenCV不支持使用Alpha通道获取视频帧。从此code snippet可以明显看出这一点。作者已经方便地假定视频文件将始终具有RGB帧。

一个快速的技巧可能是在相关位置(2-3个实例)将AV_PIX_FMT_BGR24替换为AV_PIX_FMT_BGRA,然后重新构建库以使代码正常工作。但是,这种肮脏的骇客总是会为所有视频格式生成RGBA帧。

我个人计划使用此修复程序创建PR,但这可能需要一些时间。

其他可能的解决方案是使用其他第三方库来获取.webm.mov格式的帧,然后使用OpenCV对其进行处理。