Наложение изображения с OpenCV4Android - PullRequest
0 голосов
/ 28 июня 2019

Я пытался наложить изображение поверх прямоугольника, обнаруженного камерой. Я использую функцию, которая возвращает путь моего изображения с моей SD-карты (.jpg), но похоже, что он загружается неправильно, или, по крайней мере, я не могу отобразить его там, где я хочу.

Прежде всего, я проверяю, загружено ли изображение (и загружаю его, если это не так). Затем я продолжаю распознавать прямоугольники. После того, как я его узнаю, я предполагаю наложить этот прямоугольник на кадр с загруженным изображением, а затем вернуть в ImageView измененный кадр.

Я поделюсь с вами своим кодом из функции onCameraFrame («изображение» - это объект Mat, в котором я сохраняю загруженное изображение с моей SD-карты, а «img_path» - строка, в которой хранится путь к изображению):

Mat dst = inputFrame.rgba();

//Here I check if the image is loaded
        if (image.empty()){
            Log.v("Image","Empty!");
            image = imread(img_path, CV_LOAD_IMAGE_UNCHANGED);
        } else {

            //If the image is loaded, then I proceed to process the frame.
            Mat gray = inputFrame.gray();


            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) {
                        Rect r = Imgproc.boundingRect(cnt);
                        image.copyTo(dst.submat(r));

                        Log.v("Test 1",Integer.toString(image.width()));
                        Log.v("Test 2",Integer.toString(image.height()));

                    }
                }
            }
        }
        return dst;

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

Это правильный способ проверки правильности загрузки изображения? У вас сейчас почему этот код не работает? Я также читал о функции addWeighted, но я попытался изменить размер меньшего изображения, и это не удалось.

Спасибо заранее !!

РЕДАКТИРОВАТЬ Это часть кода, где я распознаю прямоугольник, и мне нужно визуализировать новое изображение поверх прямоугольника на рамке:

 //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) {
                        Rect r = Imgproc.boundingRect(cnt);
                        image.copyTo(dst.submat(r));

                        Log.v("Test 1",Integer.toString(image.width()));
                        Log.v("Test 2",Integer.toString(image.height()));

                    }
                }

Например, вы можете проверить следующее изображение с веб-страницы приложения InkHunter: https://i1.wp.com/goosed.ie/wp-content/uploads/2016/10/inkhunter-cover-for-tattoo-ideas-1.jpg?fit=800%2C450&ssl=1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...