【发布时间】:2019-09-28 04:31:37
【问题描述】:
我正在尝试从球面投影重新创建相机的视图,以便生成的图像是正交的(实际上直线等同于图像空间中的直线)。
我之前成功使用了sphericalWarper warp 函数:
detail::SphericalWarper Projection = detail::SphericalWarper(((360.0/PX2DEG)/PI)/2.0);
Mat SrcProj;
Projection.warp(Src, CameraIntrinsics, Rotation, INTER_LINEAR, 0,SrcProj);
但是当我使用函数warpBackward 时,它需要我指定目标Mat 大小。看起来如果它不是一个非常具体的大小,它会导致错误。我挖掘了库文件并找到了发送错误的断言,并找到了这个(来自warpers_inl.hpp的sn-p):
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 图像中剪下这个大小的 Mat 的大小(或调整它的大小),然后毫无问题地使用 warpBackward 函数。
【问题讨论】:
-
你也许可以使用 warpRoi 来扭曲 ROI,得到它的大小:docs.opencv.org/3.4.0/d6/d65/…
-
谢谢,我终于解决了:)我现在更新帖子
标签: c++ opencv computer-vision opencv3.0