OpenCV中不同warp方法的区别

Ich*_*ang 6 c++ opencv

通过使用OpenCV缝合图像,我发现有几种warp方法可以执行此操作:

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();
Run Code Online (Sandbox Code Playgroud)

上面的代码取自stitching_detailed.cpp官方OpenCV样本中的项目.

我尝试了所有这些图像来拼接一组九个图像:它们产生略微不同的输出(关于失真或透视)以及不同的处理时间.

请问,有人可以详细解释我这些差异吗?

ale*_*kov 4

想象一下将贴纸贴在某个物体上。您的源图像是贴纸,变形方法表示您要覆盖什么对象以及如何覆盖。如果是的话,PlaneWarper显然是一架飞机。对于CylindricalWarperSphericalWarper分别是圆柱体和球体。其他扭曲器处理其他常见的投影,例如墨卡托投影和立体投影。如果您不知道它们是什么 - 这是一个好兆头,表明您不需要使用它们。http://en.wikipedia.org/wiki/Map_projection有相当多的信息可以帮助您入门。

这些变形器之间的主要区别在于用于将源图像像素映射到生成的全景图上的数学公式。根据您的任务,您应该选择合适的整经机。如果您要拼接全景图,您可能应该使用CylindricalWarperSphericalWarper。请考虑http://www.panoguide.com/howto/panoramas/types.jsp了解更多详细信息。