Общая структура моего трубопровода по существу выглядит так: < /p>
. Это были цилиндрически прогнозированы до обнаружения функций и сопоставления < /li>
Применить одинаковую цилиндрическую и гомографическую деформацию «онлайн» к потоку изображения < /li>
< /ol>
Я затем реализовал онлайн-часть трубопровода, как это: < /p>
// 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);
< /code>
Но вот что я не понимаю: < /p>
В трубопроводе OpenCV, они явно не рассчитывают, а затем применяют гомографии. Вместо этого они используют HomographyBasedEstimator (строка 553), чтобы оценить внутреннюю камеру (что мне не нужно делать, так как я уже знаю их), а также матрицы вращения (при предположении, что между различными взглядами нет перевода). В соответствии с реализацией класса HomographyBasedEstimator , кажется, они (неудивительно) используют гомографии для этого, но я не совсем уверен, как. OpenCV также имеет функцию DecPoseHomographymat , но кажется, что это не то, что здесь использовалось. Но так как я уже знаю внутреннюю камеру, мне не нужно использовать HomographyBasedEstimator . In fact, if I understand Szeliski's explanations correctly, the camera intrinsics and the rotation matrices are directly linked through the homography in case there is no translation via

where 0 and 1 Определите разные виды. Таким образом, я не могу использовать известную внутреннюю камеру и определить матрицы вращения через гомографию basedestimator , потому что тогда результаты могут быть выключены. Вместо этого мне пришлось бы использовать DecPoseHomographymat , чтобы найти матрицы вращения (что не очень тривиально), если я хочу следовать трубопроводу OpenCV. Но после их трубопровода, как правило, кажется хорошей идеей, потому что я ожидаю, что он будет более эффективным, чем мой подход: вместо того, чтобы делать цилиндрическую деформацию без ротации, за которой следуют деформация гомографии, они выполняют только одну (цилиндрическую) деформацию (строка 857), используя внутреннюю камеру, а также матрицу вращения. Я ожидаю, что это будет заметно быстрее, хотя в этом случае мне все равно придется поместить искаженное изображение в правильное место в панораме, что я не понимаю, как это делается в трубопроводе OpenCV, и о котором в моей нынешней реализации заботятся о трансформации гомографии, используя Warpperspective . Pipeline OpenCV реализуется так, в частности, также относится к тому, почему изображения не деформированы цилиндрически перед обнаружением/сопоставлением функций, а также о оценке гомографии/вращения. Я пытался спросить на их форуме, но они не дадут мне ответа.
Подробнее здесь: https://stackoverflow.com/questions/797 ... tion-in-an
Мобильная версия