OpenCV VideoCapture удаляет альфа-канал из видео - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть видео с альфа-каналом, и я пытаюсь разместить его поверх другого видео следующим образом:

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, так как очевидно передний план Mat, который взят из VideoCapture, какthis:

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

извлекает только изображение RGB и удаляет альфа-канал.Изначально видеофайл был в порядке, и он должен быть в формате rgba, но это не так.Что может быть причиной этой проблемы?

1 Ответ

0 голосов
/ 07 декабря 2018

К сожалению, OpenCV не поддерживает выборку видеокадров с альфа-каналом.Это видно из этого фрагмента кода .Авторы предположили, что видеофайл всегда будет иметь кадры RGB.

Быстрый взлом может заменить AV_PIX_FMT_BGR24 на AV_PIX_FMT_BGRA в соответствующих местах (2-3 экземпляра) и перестроить библиотеку, чтобы ваш код работал.Но этот грязный хак всегда будет генерировать RGBA-кадры для всех видеоформатов.

Я лично планирую создать PR с этим исправлением , но это может занять некоторое время.

Другим возможным решением будет использование какой-либо другой сторонней библиотеки дляполучить кадры формата .webm или .mov и затем обработать их с помощью OpenCV.

...