通过使用 OpenCV 来拼接图像,我发现提供了几种扭曲方法来执行此操作:
if (warp_type == "plane") warper_creator = new cv::PlaneWarper();
else if (warp_type == "cylindrical") warper_creator = new cv::CylindricalWarper();
else if (warp_type == "spherical") warper_creator = new cv::SphericalWarper();
else if (warp_type == "fisheye") warper_creator = new cv::FisheyeWarper();
else if (warp_type == "stereographic") warper_creator = new cv::StereographicWarper();
else if (warp_type == "compressedPlaneA2B1") warper_creator = new cv::CompressedRectilinearWarper(2, 1);
else if (warp_type == "compressedPlaneA1.5B1") warper_creator = new cv::CompressedRectilinearWarper(1.5, 1);
else if (warp_type == "compressedPlanePortraitA2B1") warper_creator = new cv::CompressedRectilinearPortraitWarper(2, 1);
else if (warp_type == "compressedPlanePortraitA1.5B1") warper_creator = new cv::CompressedRectilinearPortraitWarper(1.5, 1);
else if (warp_type == "paniniA2B1") warper_creator = new cv::PaniniWarper(2, 1);
else if (warp_type == "paniniA1.5B1") warper_creator = new cv::PaniniWarper(1.5, 1);
else if (warp_type == "paniniPortraitA2B1") warper_creator = new cv::PaniniPortraitWarper(2, 1);
else if (warp_type == "paniniPortraitA1.5B1") warper_creator = new cv::PaniniPortraitWarper(1.5, 1);
else if (warp_type == "mercator") warper_creator = new cv::MercatorWarper();
else if (warp_type == "transverseMercator") warper_creator = new cv::TransverseMercatorWarper();
上面的代码取自官方OpenCV样本中的stitching_detailed.cpp
项目。
我尝试了所有这些图像来拼接一组九个图像:它们产生略微不同的输出(关于失真或透视)以及不同的处理时间。
拜托,有人可以详细解释我这些差异吗?
答案 0 :(得分:2)
想象一下将贴纸放在某个物体上。您的源图像是贴纸,翘曲方法表示您要覆盖的对象和方式。在PlaneWarper
的情况下,它显然是一架飞机。对于CylindricalWarper
和SphericalWarper
,它分别是圆柱体和球体。其他的整经机处理其他常见的投影,如墨卡托和立体摄影。如果你不知道它们是什么 - 这是一个好的迹象,你不需要使用它们。 http://en.wikipedia.org/wiki/Map_projection 有相当多的信息可以帮助您入门。
这些整经器之间的主要区别在于用于将源图像像素映射到生成的全景图上的数学公式。根据您的任务,您应该选择合适的整经机。如果要缝制全景图,则应使用CylindricalWarper
或SphericalWarper
。请考虑 http://www.panoguide.com/howto/panoramas/types.jsp 了解更多详情。