Я пытаюсь воссоздать вид камеры из сферической проекции, чтобы полученное изображение было орфографическим (в действительности прямые линии приравниваются к прямым линиям в пространстве изображений).
Ранее я успешно использовал функцию деформации сферического варпера:
detail::SphericalWarper Projection = detail::SphericalWarper(((360.0/PX2DEG)/PI)/2.0);
Mat SrcProj;
Projection.warp(Src, CameraIntrinsics, Rotation, INTER_LINEAR, 0,SrcProj);
Но когда я использую функцию warpBackward
, мне нужно указать размер целевого мата. Кажется, что если он не очень определенного размера, это вызывает ошибку. Я покопался в файлах библиотеки и нашел assert, который отправляет ошибку, и нашел это (фрагмент из warpers_inl.hpp):
void RotationWarperBase<P>::warpBackward(InputArray src, InputArray K, InputArray R, int interp_mode, int border_mode, Size dst_size, OutputArray dst)
{
projector_.setCameraParams(K, R);
Point src_tl, src_br;
detectResultRoi(dst_size, src_tl, src_br);
Size size = src.size();
CV_Assert(src_br.x - src_tl.x + 1 == size.width && src_br.y - src_tl.y + 1 == size.height);
к сожалению detectResultRoi
- это защищенная функция, поэтому я немного застрял в том, как найти правильный размер целевого изображения.
Любая помощь будет высоко ценится, спасибо!
==================================== Редактировать ========== ==========================
Размер Src может быть рассчитан с помощью общедоступной функции warpRoi.
Mat SrcProj=Mat(480,640,CV_8UC3,Scalar(0,0,0));
Rect WindowSize=Projection.warpRoi(SrcProj.size(),CameraIntrinsics,Rotation);
Выше я определил свой размер вывода, затем использовал warpRoi, чтобы найти размер Src (или размер окна). Теперь у вас есть размер, который вы можете вырезать мат этого размера из изображения Src (или изменить его размер), а затем без проблем использовать функцию warpBackward.