Почему изображения не должны быть цилиндрически деформированы перед оценкой гомографии в конвейере сшивания изображений?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему изображения не должны быть цилиндрически деформированы перед оценкой гомографии в конвейере сшивания изображений?

Сообщение Anonymous »

Я работаю над конвейером сшивания изображений для видеопотоков, но мне все еще не хватает некоторых ключевых идей. Например, я использую «Выравнивание и сшивание изображений: руководство» Селиски для общего понимания и подробный образец конвейера сшивания OpenCV для фактической реализации (также существует для Python здесь).
Общая структура моего конвейера по существу выглядит следующим образом:
  • определяем гомографии и размер панорамы «автономно», используя некоторые эталонные изображения которые были цилиндрически спроецированы до обнаружения и сопоставления объектов.
  • применил ту же цилиндрическую и гомографическую деформацию «онлайн» к потоку изображений.
Затем я реализовал онлайн-часть конвейера следующим образом:

Код: Выделить всё

// source image/frame to be warped
cv::cuda::GpuMat img;
// Camera intrinsic matrix K which is known from documentation and contains focal length and image resolution
cv::Mat K;
// Camera focal length
float& f = K.at(0, 0);
// Rotation matrix R which is required for the cylindrical warp but that I do not know (identity for no rotation)
cv::Mat R = cv::Mat::eye(3, 3, CV_32F);
// Homography matrix H previously determined through feature matching
cv::Mat H;
// previously determined panorama size
cv::Size panoramaSize;

// initialize cylindrical warper
cv::detail::CylindricalWarperGpu warper(f);
warper.buildMaps(img_size, K, R, cylXMap, cylYMap);

// perform cylindrical warp
cv::cuda::GpuMat cylWarped;
cv::cuda::remap(img, cylWarped, cylXMap, cylYMap, cv::INTER_LINEAR, cv::BORDER_CONSTANT);

// perform homography warp
cv::cuda::GpuMat homWarped;
cv::cuda::warpPerspective(cylWarped, homWarped, H, panoramaSize, cv::INTER_LINEAR, cv::BORDER_CONSTANT);
Но вот чего я не понимаю:
В конвейере сшивания OpenCV они не вычисляют явно, а затем применяют гомографии. Вместо этого они используют HomographyBasedEstimator (строка 553) для оценки встроенных функций камеры (что мне не нужно делать, поскольку я их уже знаю), а также матриц вращения (при условии, что между различными представлениями нет перевода). Судя по реализации класса HomographyBasedEstimator, кажется, что они (что неудивительно) используют для этого гомографии, но я не совсем понимаю, как это сделать. В OpenCV также есть функция decomposeHomographyMat, но, похоже, здесь использовалась не она. Но поскольку я уже знаю встроенные функции камеры, мне не нужно использовать HomographyBasedEstimator. На самом деле, если я правильно понимаю объяснения Селиски, встроенные функции камеры и матрицы вращения напрямую связаны через гомографию в случае отсутствия перевода через
Изображение

где 0 и 1 обозначить разные взгляды. Поэтому я не могу использовать известные встроенные функции камеры и определять матрицы вращения с помощью HomographyBasedEstimator, потому что тогда результаты могут быть неверными. Вместо этого мне пришлось бы использовать decomposeHomographyMat, чтобы найти матрицы вращения (что не очень тривиально), если я хочу следовать конвейеру OpenCV. Но следование их конвейеру в целом кажется хорошей идеей, потому что я ожидаю, что это будет более эффективно, чем мой подход: вместо выполнения цилиндрической деформации без вращения с последующей гомографической деформацией они выполняют только одну (цилиндрическую) деформацию (строка 857), используя встроенные функции камеры, а также матрицы вращения. Я ожидал, что это будет значительно быстрее, хотя в этом случае мне все равно придется поместить искаженное изображение в правильное место панорамы, что я не понимаю, как это делается в конвейере OpenCV, и что в моей текущей реализации обеспечивается преобразованием гомографии с использованием warpPerspective.
В конечном счете, я хотел бы сделать свой конвейер максимально быстрым/эффективным, но я также не понимаю, почему Конвейер OpenCV реализован таким, какой он есть, в частности, в отношении того, почему изображения не деформируются по цилиндрической форме перед обнаружением/сопоставлением признаков и оценкой гомографии/вращения. Я считаю, что цилиндрическую и гомографическую деформацию, вероятно, можно выполнить за один шаг, но я не понял, как это сделать. Я пытался задать вопрос на форуме OpenCV, но там мне не дали ответа.

Подробнее здесь: https://stackoverflow.com/questions/797 ... tion-in-an
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»