Как проверить, хороша ли полученная матрица гомографии?

Этот вопрос уже былспросил, но я все еще нене понимаю Я получаю матрицу гомографии, звоняcv::findHomography из множества точек. Мне нужно проверить,актуально или нет.

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

Какие ограничения можно использовать для проверки адекватности самой матрицы гомографии?

 Francesco Callari19 февр. 2013 г., 14:42
Смотрите [этот] [1] ответ, который я опубликовал некоторое время назад. [1]:stackoverflow.com/questions/10972438/...

Ответы на вопрос(2)

Решение Вопроса

Ваш вопрос математический. Учитывая матрицу 3х3, решите, представляет ли она хорошее жесткое преобразование. Трудно определить, что естьхорошо" но вот некоторые подсказки, которые могут помочь вам

Гомография должна сохранять направление многоугольных точек. Разработайте простой тест. Точки (0,0), (imwidth, 0), (ширина, высота), (0, высота) представляют четырехугольник с расположенными по часовой стрелке точками. Примените гомографию к этим точкам и посмотрите, расположены ли они по часовой стрелке, если они становятся против часовой стрелки, ваша гомография переворачивает (отражает) изображение, которое иногда все еще в порядке. Но если ваши очки не в порядке, то у вас есть "плохая гомография "Гомография неслишком сильно измените масштаб объекта. Например, если вы ожидаете, что оно уменьшит или увеличит изображение до X раз, просто проверьте это правило. Преобразуйте 4 точки (0,0), (imwidth, 0), (width-1, height), (0, height) с гомографией и вычислите площадь четырехугольника (метод opencv вычисления площади многоугольника), если отношение области слишком велики (или слишком малы), вы, вероятно, имеете ошибку.Хорошая гомография обычно использует низкие значения перспективности. Обычно, если размер изображения составляет ~ 1000x1000 пикселей, эти значения должны быть ~ 0.005-0.001. Высокая перспективность вызовет огромные искажения, которые, вероятно, являются ошибкой. Если вы неНе знаю, где находятся эти значения, прочитайте мой пост:пытаясь понять аффинное преобразование , Это объясняет аффинное преобразование математики, а два других значения являются параметрами перспективы.

Я думаю, что если вы проверите вышеуказанное условие 3 (условие 2 является наиболее важным), вы сможете обнаружить большинство проблем. Удачи

 rbaleksandar27 мая 2014 г., 14:35
В дополнение к первой проверке предложенийanswers.opencv.org/question/2588/check-if-homography-is-good, Вычисление определителя того, чтодолжна быть подматрицей вращения в гомографии и проверять,Большой или меньший ноль говорит вам, была ли сохранена ориентация (в основном вычисление такого детерминанта является эквивалентом формулы Пифагора).

Изменить: Этот ответ не имеет отношения к вопросу, но обсуждение может быть полезным для тех, кто пытается использовать результаты сопоставления для распознавания, как я!

Это может помочь кому-то:

Point2f[] objCorners = { new Point2f(0, 0),
    new Point2f(img1.Cols, 0),
    new Point2f(img1.Cols, img1.Rows),
    new Point2f(0, img1.Rows) };

Point2d[] sceneCorners = MyPerspectiveTransform3(objCorners, homography);
double marginH = img2.Width * 0.1d;
double marginV = img2.Height * 0.1d;
bool homographyOK = isInside(-marginH, -marginV, img2.Width + marginH, img2.Height + marginV, sceneCorners);
if (homographyOK)
    for (int i = 1; i < sceneCorners.Length; i++)
        if (sceneCorners[i - 1].DistanceTo(sceneCorners[i]) < 1)
        {
            homographyOK = false;
            break;
        }
if (homographyOK)
    homographyOK = isConvex(sceneCorners);
if (homographyOK)
    homographyOK = minAngleCheck(sceneCorners, 20d);




     private static bool isInside(dynamic minX, dynamic minY, dynamic maxX, dynamic maxY, dynamic coors)
        {
            foreach (var c in coors)
                if ((c.X < minX) || (c.Y < minY) || (c.X > maxX) || (c.Y > maxY))
                    return false;
            return true;
        }      
        private static bool isLeft(dynamic a, dynamic b, dynamic c)
        {
            return ((b.X - a.X) * (c.Y - a.Y) - (b.Y - a.Y) * (c.X - a.X)) > 0;
        }
        private static bool isConvex(IEnumerable points)
        {
            var lst = points.ToList();
            if (lst.Count > 2)
            {
                bool left = isLeft(lst[0], lst[1], lst[2]);
                lst.Add(lst.First());
                for (int i = 3; i < lst.Count; i++)
                    if (isLeft(lst[i - 2], lst[i - 1], lst[i]) != left)
                        return false;
                return true;
            }
            else
                return false;
        }
        private static bool minAngleCheck(IEnumerable points, double angle_InDegrees)
        {
            //20d * Math.PI / 180d
            var lst = points.ToList();
            if (lst.Count > 2)
            {                
                lst.Add(lst.First());
                for (int i = 2; i < lst.Count; i++)
                {
                    double a1 = angleInDegrees(lst[i - 2], lst[i-1]);
                    double a2 = angleInDegrees(lst[i], lst[i - 1]);
                    double d = Math.Abs(a1 - a2) % 180d;

                    if ((d < angle_InDegrees) || ((180d - d) < angle_InDegrees))
                        return false;
                }
                return true;
            }
            else
                return false;
        }
        private static double angleInDegrees(dynamic v1, dynamic v2)
        {
            return (radianToDegree(Math.Atan2(v1.Y - v2.Y, v1.X - v2.X))) % 360d;
        }
        private static double radianToDegree(double radian)
        {
            var degree = radian * (180d / Math.PI);
            if (degree < 0d)
                degree = 360d + degree;

            return degree;
        }
        static Point2d[] MyPerspectiveTransform3(Point2f[] yourData, Mat transformationMatrix)
        {
            Point2f[] ret = Cv2.PerspectiveTransform(yourData, transformationMatrix);
            return ret.Select(point2fToPoint2d).ToArray();
        }  

 user308593125 янв. 2017 г., 11:46
FYI:stackoverflow.com/questions/11053099/... на мой взгляд, наиболее правдоподобное решение, которое явидел по этой теме.
 Koray25 янв. 2017 г., 11:15
Я думаю, что названия функций объясняются сами собой. Это то, что я мог сделать. Резюме: после преобразования с помощью гомографии проверяется, находится ли найденная форма 1) внутри приемлемой области, 2) является ли размер приемлемым, 3) является выпуклой или нет (здесь ошибка) 4) форма 'Внутренние углы приемлемы или нет. Есть несколько ошибок, яЯ обновлю код, когда моя работа в этом закончится. И да, я в отчаянии, если есть какой-то другой способ добиться лучшего чека. Мне также нравится быть в отчаянии и читать другие народы много кодирует все время.
 user308593125 янв. 2017 г., 10:16
слишком много кода без комментариев толькополезный для отчаявшихся
 user308593125 янв. 2017 г., 12:00
Если я правильно понял, у вас есть два массива расстояний, объединяющих произвольное количество доступных точек - один с расстояниями друг до друга, а второй после преобразования перспективы. Эти расстояния (не местоположения) остаются неизменными, если это было правильное определение. Другими словами, имея идеальную гомографию, вы получаете ровно 0 как разность обоих массивов, включая реальные случаи, в которых вам нужно указать диапазон допуска (он определен как < 1 приемлемо). За что яЯ видел на вашей картинке, это должно поймать ваше дело
 Koray31 янв. 2017 г., 08:01
Мы построили матрицу InverseHomogrphy и нашли исправленные значения для sceneCorners. Эти значения и расстояния практически одинаковы (- + <0.01) с исходными угловыми точками изображения почти на всех изображениях, которые я пробовал. Как бы то ни было, большинство из них ошибаются и должны быть отклонены. Я'Я действительно пытаюсь понять, но я не могт :(
 Koray25 янв. 2017 г., 11:54
Спасибо за эту ссылку. Я читал это раньше. Я думаю, что это зависит от местоположения слишком сильно. Я нене вижу, как это будет успешно для такого случая:emgu.com/wiki/images/StopSignDetectionExample1.png
 Koray25 янв. 2017 г., 12:23
Возможно, я не правильно понял. Но с изображением, которое я добавил к своему ответу, я думаю, расстояние будет больше 1. Так что этот результат будет отклонен, нене так ли? Я ценю, если вы можете объяснить, как я не прав с этим; если я.
 user308593130 янв. 2017 г., 15:53
прошу прощения, яЯ работаю только неполный рабочий день по этому вопросу. Вы были правы, прямое сравнение расстояний между двумя точками до / после гомографии действительно применимо только для небольшого значения асимметрии. Однако, что не должноНа это влияет отношение между двумя расстояниями:d1_before_homography / d2_before_homography != d1_after_homography / d2_after_homography +/- tolerance согласовано?
 Koray08 февр. 2017 г., 12:14
Мои целевые изображения - это снимки улиц, поэтому их может быть много. Я мог определять места знаков (используя сопоставление по форме и цвету, в основном зависит от cv.MatchShapes), однако я изо всех сил пытаюсь предсказать, какой это знак. Интересно, если это возможно с отдельными шаблонами каждого знака, я могупока не нашел. Я попробую методы SVM и подготовлю некоторые обучающие данные. Хотел бы я поговорить с тобой лицом к лицу.
 user308593108 февр. 2017 г., 11:18
еслиЯ нене иметь никакой реальной точки или любой другой информации о тестовом изображении значит ты неЕсли вы не знаете, какой знак следует ожидать, то да, вы действительно должны перейти к машинному обучению, например. В противном случае этот подход все еще действителен (даже если сравнение углов между точками до / после может еще больше повысить надежность;)
 user308593130 янв. 2017 г., 17:46
Да, я думаю, что у нас другой взгляд на проблему: dx_до_ Гомография относится к вашему левому планарному (т.е. идеальному сравнению) изображению знака «Стоп». dx_после Гомография нездесь показано вообще. Это уже искаженное изображение, похожее на планарное (например:inst.eecs.berkeley.edu/~cs194-26/fa15/upload/files/proj7B/... исправленный и обрезанный). Если вы сравните расстояния здесь с тем, что на исходном изображении, вы можете легко проверить, была ли ваша гомография безумной или это правдоподобный результат.
 user308593131 янв. 2017 г., 10:06
Извините за отсутствие хорошего объяснения в комментариях. Просто говорят:(1) Вы выяснили ключевые моменты.(2) гомография рассчитана(3) создать исправленное искаженное изображение(4) используйте рассчитанную гомографию не только для растягивания изображения, но и для определения расположения точек (1) на изображении (3). Это простоkp_bef * homography = kp_aft (Яне Уверен насчет порядка матриц и обратной гомографии здесь).(5) Сравните эти КП и проверьте, совпадают ли расстояния в (1) с расстояниями в (4).t mix (1,4) KP для расчета расстояния
 user308593108 февр. 2017 г., 11:49
Если у вас есть не более чем n знаков для различения (снет такие изменения, как грязь, снег и т. д., как ваш пример STOP выше), то вы 'Вы прекрасно можете установить алгоритм с сопоставлением ключевых точек. Однако я могуСкажите, будет ли точность или время обработки лучше, если вместо этого используется ML.
 user308593110 февр. 2017 г., 11:08
Я не настолько знаком со свойствами SVM 'в таких областях, в основном яМы читали о нейронных сетях в этом контексте. Если вы все еще не уверены в том, что подходит лучше всего, для лучшего обзора взгляните на документы по распознаванию лиц, так как это в значительной степени та же самая ситуация, но даже более сложная (то есть то, что работает, должно быть решением для вас!) , Кстати, я полагаю, вам следовало открыть новую тему;)
 Koray08 февр. 2017 г., 11:41
Да, я пытался использовать результаты сопоставления, чтобы предсказать, какой знак присутствует на изображении.
 user308593131 янв. 2017 г., 10:30
Примечание для (5): Вы должны использовать KP из эталонного / идеального img для расчета расстояний.kp_bef ссылается на КП в реальной, сырой сцене, как, конечно,kp_aft растянутые позиции взяты из реального изображения. То есть сравнить расстояние идеального КП с КП от реальной, но растянутой сцены
 Koray30 янв. 2017 г., 17:17
Я ценю ваш ответ. Я не могу понять то, что вы видите. Стоп знак слева (до гомографии) имеет квадратную форму, скажем, он имеет длину 1-1-1-1 единицы на каждый сегмент. Зеленые линии справа - это значения после преобразования, которые выглядят как 2-2-1-1. Примените формулу 1/2 == 1/2 == 1/1 == 1/1, это нормально для допусков 1. Это та же формула наstackoverflow.com/a/12087175/1266873 Также расстояния могут быть в порядке в соответствии с этой формулой, но результирующая форма может быть вогнутой или самопересекающейся, которая должна быть отклонена. Я надеюсь, что нене понял тебя и мог ясно выразить себя
 Koray07 февр. 2017 г., 19:04
Извините за поздний ответ, я спрашивал об этом своих друзей. Я думаю, что я полностью неправильно понял этот вопрос. То, что я пытался сделать, это: использовать матрицу гомографии, чтобы решить, было ли изображение шаблона успешно найдено на тестовом изображении. Я нене иметь никакой реальной точки или любой другой информации о тестовом изображении. Поэтому я думаю, что мой ответ здесь не имеет отношения к заданному вопросу, а также не является правильным подходом к классификации. Большое спасибо за ваше время и усилия.

Ваш ответ на вопрос