Сравнение двух изображений

104
24 января 2021, 00:10

Пишу программу, используя эту статью: https://moluch.ru/archive/115/31188/ Мой алгоритм не правильно распознает. Из этой статьи не понятен пункт: Почему в 4 угольнике - 4 треугольника, как формируются эти треугольники?

Получаю srcPoints' таким образом:

Calib3d.findHomography(pts1Mat, pts2Mat, Calib3d.RANSAC, 20, outputMask, 2000, 0.995);
List<DMatch> srcPoints= new ArrayList<DMatch>();
MatOfDMatch goodMatchesRANSAC = new MatOfDMatch();
for (int i = 0; i < good_matches.size(); i++) {
  if (outputMask.get(i, 0)[0] == 1) {
     srcPoints.add(good_matches.get(i));
  }
 }
goodMatchesRANSAC.fromList(srcPoints);

pts1/2Mat - ключевые точки первого и второго изображения

Далее нахожу критерий сходства:

 private static double sumer(Point c1, Point c2, Point c3) {
        double sum = 0;
        Point[] dMatches = new Point[3];
        dMatches[0] = c1;
        dMatches[1] = c2;
        dMatches[2] = c3;
        for (int i = 0; i < 2; i++) {
            for (int j = i + 1; j < 3; j++) {
                Point d1 = dMatches[i];
                Point d2 = dMatches[j];
                double pointX = d1.x - d2.y;
                pointX *= pointX;
                double pointY = d1.x - d2.y;
                pointY *= pointY;
                sum = Math.sqrt(pointX + pointY);
            }
        }
        return sum;
    }
    private static double sumer(DMatch c1, DMatch c2, DMatch c3) {
        double sum = 0;
        DMatch[] dMatches = new DMatch[3];
        dMatches[0] = c1;
        dMatches[1] = c2;
        dMatches[2] = c3;
        for (int i = 0; i < 2; i++) {
            for (int j = i + 1; j < 3; j++) {
                DMatch d1 = dMatches[i];
                DMatch d2 = dMatches[j];
                int pointX = d1.queryIdx - d2.queryIdx;
                pointX *= pointX;
                int pointY = d1.trainIdx - d2.trainIdx;
                pointY *= pointY;
                sum = Math.sqrt(pointX + pointY);
            }
        }
        return sum;
    }

 double summer1[] = new double[3];
            double summer2[] = new double[3];
            int modRansak = goodMatchesRANSAC.toArray().length;
            if (modRansak > 5) {
                int step = modRansak / 3;
                double aver[] = new double[3];
                double averad[] = new double[3];
                aver[0] = 0;
                averad[0] = 0;
                averad[1] = 0;
                averad[2] = 0;
                aver[1] = 0;
                aver[2] = 0;
                for (int n = 0; n < 3; n++) {
                    int index[] = new int[4];
                    for (int i = 0; i < 4; i++) {
                        int j = step * i + n;
                        if (j >= modRansak) {
                            j = modRansak - n - 1;
                        }
                        index[i] = j;
                    }
                    int j1 = index[0];
                    int j2 = index[1];
                    int j3 = index[2];
                    int j4 = index[3];
                    DMatch[] good = goodMatchesRANSAC.toArray();
                    double sum1[] = new double[3];
                    sum1[0] = sumer(good[j1], good[j2], good[j3]);
                    sum1[1] = sumer(good[j2], good[j3], good[j4]);
                    sum1[2] = sumer(good[j1], good[j3], good[j4]);
                    Point[] points = pts2Mat.toArray();
                    double sum2[] = new double[3];
                    sum2[0] = sumer(points[j1], points[j2], points[j3]);
                    sum2[1] = sumer(points[j2], points[j3], points[j4]);
                    sum2[2] = sumer(points[j1], points[j3], points[j4]);
                    double a = 0;
                    for (int i = 0; i < 3; i++) {
                        a += (sum1[i] / sum2[i]);
                    }
                    aver[n] = a / 3;
                    for (int i = 0; i < 3; i++) {
                        averad[n] = (aver[n] - a) /3;
                    }
                }
                double min = averad[0];
                for (double d : averad) {
                    if (min > d) {
                        min = d;
                    }
                }
                System.out.println("min " + min);
                double alikeValue = 0;
                if (min < 0.2) {
                    alikeValue = (1 - 1.5 * min) * modRansak;
                    System.out.println("alike " + alikeValue);
                }
            }
READ ALSO
Netbeans 11 java BUILD FAILED

Netbeans 11 java BUILD FAILED

Компилирую проект java web в netbeans 11, JDK-8В проекте ошибок нет, но не собирается, - BUILD FAILED

100
Создать приложение для чтения книг под android на Java

Создать приложение для чтения книг под android на Java

Подскажите, пожалуйста, алгоритм - куда двигаться, чтобы создать приложение для чтения книг под androidМожет быть какая-нибудь готовая библиотека...

124
Поиск данных между двумя датами

Поиск данных между двумя датами

Есть метод, который ищет данные между двумя датамиНо не включительно

85
Понимание MediaCodec и MediaExtractor

Понимание MediaCodec и MediaExtractor

Я хочу выполнить некоторую обработку аудиофайлов без их воспроизведения, только математикаУ меня есть сомнения о том, правильно ли я это...

197