Общая структура моего конвейера по существу выглядит следующим образом:
- определяем гомографии и размер панорамы «автономно», используя некоторые эталонные изображения которые были цилиндрически спроецированы до обнаружения и сопоставления объектов.
- применил ту же цилиндрическую и гомографическую деформацию «онлайн» к потоку изображений.
Код: Выделить всё
// 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
Мобильная версия