Наложить изображение поверх живого кадра - OpenCV4Android - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь наложить на живую рамку небольшое изображение, ранее выбранное пользователем.У меня уже есть путь к изображению из предыдущей деятельности.Моя проблема в том, что я не могу показать изображение на рамке.

Я пытаюсь определить прямоугольник на рамке, а поверх прямоугольника отобразить выбранное изображение.Я мог обнаружить прямоугольник, но теперь я не могу отобразить изображение в любой части кадра (сейчас мне плевать на прямоугольник).Я пытался сделать это с объяснениями Добавление наложения изображений OpenCV для Android и добавить маленькое изображение водяного знака к большому изображению opencv4android , но у меня это не сработало.

public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

        Mat gray = inputFrame.gray();
        Mat dst = inputFrame.rgba();

        Imgproc.pyrDown(gray, dsIMG, new Size(gray.cols() / 2, gray.rows() / 2));
        Imgproc.pyrUp(dsIMG, usIMG, gray.size());

        Imgproc.Canny(usIMG, bwIMG, 0, threshold);

        Imgproc.dilate(bwIMG, bwIMG, new Mat(), new Point(-1, 1), 1);

        List<MatOfPoint> contours = new ArrayList<MatOfPoint>();

        cIMG = bwIMG.clone();

        Imgproc.findContours(cIMG, contours, hovIMG, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);


        for (MatOfPoint cnt : contours) {

            MatOfPoint2f curve = new MatOfPoint2f(cnt.toArray());

            Imgproc.approxPolyDP(curve, approxCurve, 0.02 * Imgproc.arcLength(curve, true), true);

            int numberVertices = (int) approxCurve.total();

            double contourArea = Imgproc.contourArea(cnt);

            if (Math.abs(contourArea) < 100) {
                continue;
            }

            //Rectangle detected
            if (numberVertices >= 4 && numberVertices <= 6) {

                List<Double> cos = new ArrayList<>();

                for (int j = 2; j < numberVertices + 1; j++) {
                    cos.add(angle(approxCurve.toArray()[j % numberVertices], approxCurve.toArray()[j - 2], approxCurve.toArray()[j - 1]));
                }

                Collections.sort(cos);

                double mincos = cos.get(0);
                double maxcos = cos.get(cos.size() - 1);

                if (numberVertices == 4 && mincos >= -0.3 && maxcos <= 0.5) {

                     //Small watermark image
                    Mat a = imread(img_path);

                    Mat bSubmat = dst.submat(0, dst.rows() -1 , 0, dst.cols()-1);
                    a.copyTo(bSubmat);


                }
            }

        }

        return dst;

    }

ПРИМЕЧАНИЕ. Img_path - это путь к выбранному изображению, которое я хочу отобразить в кадре.Я получил это из предыдущего упражнения.

К настоящему времени я просто хочу отобразить изображение поверх рамки.Позже я попытаюсь отобразить его в той же позиции, где он нашел прямоугольник.Пожалуйста, любые предложения или рекомендации приветствуются, так как я новичок в OpenCV.Извините за мой английский, но не стесняйтесь спрашивать меня о том, что я не правильно объяснил.Я сделаю все возможное, чтобы объяснить это лучше.Большое спасибо!

1 Ответ

0 голосов
/ 18 июня 2019

Если вы просто хотите отобразить изображение как наложение, а не сохранить его как часть видео, вам может быть проще просто отобразить его в отдельном виде над видом видео. Это, вероятно, потребует меньше времени на обработку, батарею и т. Д.

Если вы хотите нарисовать на растровом изображении с камеры, то следующее позволит вам сделать это:

   Bitmap cameraBitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length, opt);
            Canvas camImgCanvas = new Canvas(cameraBitmap);
            Drawable d = ContextCompat.getDrawable(getActivity(), R.drawable.myDrawable);
            //Centre the drawing
            int bitMapWidthCenter = cameraBitmap.getWidth()/2;
            int bitMapheightCenter = cameraBitmap.getHeight()/2;
            d.setBounds(bitMapWidthCenter, bitMapheightCenter, bitMapWidthCenter+d.getIntrinsicWidth(),
                    bitMapheightCenter+d.getIntrinsicHeight());
            //And draw it...
            d.draw(camImgCanvas);
...