Детали сшивания изображений с OpenCV

Я пытаюсь глубоко зашить. я использую cv::detail,

Я пытаюсь следовать этот пример:

Я примерно понимаю шовный трубопровод.

есть функция matchesGraphAsString() которые возвращают график. Мне интересно, как он вообще вычисляет этот график. Далее, каково определение доверительного интервала в этом случае.

Вывод в формате DOT и пример графика выглядит

graph matches_graph{
"15.jpg" -- "13.jpg"[label="Nm=75, Ni=50, C=1.63934"];
"15.jpg" -- "12.jpg"[label="Nm=47, Ni=28, C=1.26697"];
"15.jpg" -- "14.jpg"[label="Nm=149, Ni=117, C=2.22011"];
"11.jpg" -- "13.jpg"[label="Nm=71, Ni=52, C=1.77474"];
"11.jpg" -- "9.jpg"[label="Nm=46, Ni=37, C=1.69725"];
"11.jpg" -- "10.jpg"[label="Nm=87, Ni=73, C=2.14076"];
"9.jpg" -- "8.jpg"[label="Nm=122, Ni=99, C=2.21973"];
}

Что значит label, Nm, а также Ni значит здесь? В официальном документе, похоже, отсутствуют эти детали.

5

Решение

Это действительно очень интересный вопрос. Как отметил @hatboyzero, значение переменных достаточно простое:

  • Nm количество совпадений (в перекрывающейся области, поэтому очевидные выбросы уже удалены).
  • Ni это число вкладышей после нахождения гомографии с RANSAC.
  • С это уверенность в том, что два изображения совпадают.

Фон для соответствия

Построение панорамы осуществляется путем поиска точки интереса во всех изображениях и вычислениях дескрипторы для них. Эти дескрипторы, такие как SIFT, SURF и ORB, были разработаны таким образом, чтобы можно было обнаружить одни и те же части изображения. Это всего лишь вектор среднего размера (типично 64 или 128 измерений). Путем вычисления L2 или некоторого другого расстояния между двумя дескрипторами можно найти совпадения. Сколько найденных совпадений в паре изображений описывается термином Nm.

Обратите внимание, что до сих пор сопоставление было сделано только через внешний вид областей изображения вокруг точек интереса. Как правило, многие из этих совпадений просто неверны. Это может быть потому, что дескриптор выглядит одинаково (например, повторяющийся объект, такой как подоконники в многооконном здании или листья на дереве), или потому что дескриптор слишком неинформативен.

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

RANSAC это алгоритм золотого стандарта, чтобы найти лучшее преобразование и все совпадения, которые согласуются с этим преобразованием. Количество этих последовательных совпадений называется Ni. Ransac работает, случайным образом выбирая в этом случае 4 совпадения (см. Раздел 3.1) и подбирая гомографию к этим четырем совпадениям. Затем посчитайте, сколько совпадений из всех возможных совпадений будет соответствовать этой гомографии. Повторите 500 раз (см. Статью) и, в конце, возьмите модель, у которой было наибольшее количество вкладышей. Затем пересчитайте модель со всеми значениями. Название алгоритма происходит от RANdom SAmple Consensus: RanSaC.

Уверенность-Term

Вопрос для меня был, об этом загадочном уверенность. Я быстро нашел, где это было рассчитано.

От stitching/sources/matches.cpp:

// These coeffs are from paper M. Brown and D. Lowe. "Automatic Panoramic Image Stitching
// using Invariant Features"matches_info.confidence = matches_info.num_inliers / (8 + 0.3 * matches_info.matches.size());

// Set zero confidence to remove matches between too close images, as they don't provide
// additional information anyway. The threshold was set experimentally.
matches_info.confidence = matches_info.confidence > 3. ? 0. : matches_info.confidence;

упомянутая бумага
В разделе 3.2 («Вероятностная модель для проверки соответствия изображения») есть еще некоторые подробности того, что это значит.

Читая этот раздел, кое-что выделялось.

  1. В их модели много переменных (в основном вероятностей). Эти значения определены в документе без какого-либо обоснования. Ниже приведено ключевое предложение:

Хотя на практике мы выбрали значения для p0, p1, p (m = 0), p (m = 1) и pmin, их в принципе можно узнать из данных.

Итак, это всего лишь теоретическое упражнение, поскольку параметры были взяты из воздуха. Обратите внимание на можно в принципе научиться.

  1. Бумага имеет в уравнении 13 доверительный расчет. Если читать правильно, это означает, что matches_info.confidence указывает на правильное соответствие между двумя изображениями, если его значение выше 1.

  2. Я не вижу никакого оправдания удалению совпадения (установив достоверность на 0), когда достоверность выше 3. Это просто означает, что есть очень маленькие выбросы. Я думаю, что программисты подумали, что большое количество совпадений, которые оказываются посторонними, означает, что изображения сильно перекрываются, но это не обеспечивается алгоритмами, стоящими за этим. (Просто совпадения основаны на появлении функций.)

5

Другие решения

Взглянув на исходный код OpenCV, доступный в Интернете, я понял, что они имеют в виду следующее:

  • Nm — Количество парных совпадений
  • Ni — Количество геометрически согласованных совпадений
  • С — Уверенность два изображения с одной и той же панорамы

Я основываю свои предположения на фрагменте из тела matchesGraphAsString в Модули / сшивание / SRC / motion_estimators.cpp с версии 2.4.2 исходного кода OpenCV. То есть

        str << "\"" << name_src << "\" -- \"" << name_dst << "\""<< "[label=\"Nm=" << pairwise_matches[pos].matches.size()
<< ", Ni=" << pairwise_matches[pos].num_inliers
<< ", C=" << pairwise_matches[pos].confidence << "\"];\n";

Кроме того, я также смотрю на документацию для подробнее :: MatchesInfo для получения информации о Ni а также С термины.

2

По вопросам рекламы [email protected]