@rodion836

Как наложить изображение на изображение opencv (видео)?

Пишу небольшое приложение : добавляет картину (например, надеть очки ) на видео полученное с камеры.
void addMask(Mat src,Rect face){

        Mat roi;
        Imgproc.resize(mask,mask,face.size());
       roi= src.submat(face);
                //.copyTo(roi);

        Mat maskInv= new Mat();
        Mat mat1_bg = new Mat();
        Mat mat2_fg = new Mat();
        Mat maskGray=new Mat();

        Core.extractChannel(mask,maskGray,3);
        Core.bitwise_not(maskGray,maskInv);

        ArrayList<Mat> roiChannels = new ArrayList<>(4);
        ArrayList<Mat> roiMask = new ArrayList<>(4);
        roiMask.add(new Mat());
        roiMask.add(new Mat());
        roiMask.add(new Mat());
        roiMask.add(new Mat());

        Core.split(roi,roiChannels);

        Core.bitwise_and(roiChannels.get(0),maskInv,roiMask.get(0));
        Core.bitwise_and(roiChannels.get(1),maskInv,roiMask.get(1));
        Core.bitwise_and(roiChannels.get(2),maskInv,roiMask.get(2));
        Core.bitwise_and(roiChannels.get(3),maskInv,roiMask.get(3));

        Core.merge(roiMask,mat1_bg);

        maskInv.release();
        roi.release();

        ArrayList<Mat> maskChannels = new ArrayList<>(4);
        ArrayList<Mat> maskList = new ArrayList<>(4);
        maskList.add(new Mat());
        maskList.add(new Mat());
        maskList.add(new Mat());
        maskList.add(new Mat());

        Core.split(mask,maskChannels);

        Core.bitwise_and(maskChannels.get(0),maskGray,maskList.get(0));
        Core.bitwise_and(maskChannels.get(1),maskGray,maskList.get(1));
        Core.bitwise_and(maskChannels.get(2),maskGray,maskList.get(2));
        Core.bitwise_and(maskChannels.get(3),maskGray,maskList.get(3));

        Core.merge(maskList,mat2_fg);

        maskGray.release();
        Mat dst = new Mat();
        Core.add(mat1_bg,mat2_fg,dst);
       dst.copyTo(src.submat(face));

       mat1_bg.release();
       mat2_fg.release();
       dst.release();
    }


Если применять к статическому изображению ,то проблем нет. Но если, это видео, то с каждым кадром, верхнее изображение начинает размываться и в итоге просто белое пятно сверху на видео. Как исправить?
Спасибо.
  • Вопрос задан
  • 672 просмотра
Пригласить эксперта
Ответы на вопрос 1
@rodion836 Автор вопроса
Вообщем нашел решение. Поскольку copyTo поддерживает копирование по маске, то можно обойтись без побитовых операций. Маску делаем из альфа канала(PNG).
void addMask(Mat src, Rect face) {

        Mat mask = new Mat();
        Mat matResize= new Mat();

        Imgproc.resize(imgIn,matResize,face.size());

        Core.extractChannel(matResize, mask, 3);

        matResize.copyTo(src.submat(face),mask);

        mask.release();
        matResize.release();

    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы