vrProjector is a python library and command-line tool to convert from one type of spherical projection to another. Currently it supports converting between Equirectangular, Cubemaps and Side-by-Side fisheye projections.
You'll need the python imaging library; I've found it's best to get it via Pillow:
$ pip install PillowYou'll also need numpy:
$ pip install numpyYou can run vrProjector simply by running the vrProjectorCmd shell script on the command-line. You'll need to specify the source and output projection types as well as the source/output images and paramaters themselves. For example, use this to turn an equirectangular image into a set of 128x128 pixel cubemap faces:
$ ./vrProjectorCmd --sourceProjection Equirectangular --sourceImage images/equirectangular.png --sourceProjection Equirectangular --outProjection CubeMap --outImage "front.png right.png back.png left.png top.png bottom.png" --outWidth 128 --outHeight 128This converts an input equirectangular image into a side-by-side fisheye projection:
$ ./vrProjectorCmd --sourceProjection Equirectangular --sourceImage images/equirectangular.png --sourceProjection Equirectangular --outProjection SideBySideFisheye --outImage foo.png --outWidth 256 --outHeight 128You can access the full set of available commands via the -h switch:
$ ./vrProjectorCmd -h usage: vrProjectorWrapper.py [-h] --sourceProjection SOURCEPROJECTION --sourceImage SOURCEIMAGE [--useBilnear USEBILNEAR] --outProjection OUTPROJECTION --outImage OUTIMAGE --outWidth OUTWIDTH --outHeight OUTHEIGHT Reproject photospheres optional arguments: -h, --help show this help message and exit --sourceProjection SOURCEPROJECTION Type of source projection. Valid values are: Equirectangular, Cubemap, SideBySideFisheye --sourceImage SOURCEIMAGE Source image[s]. List multiple images in double quotes like so "front.png right.png back.png left.png top.png bottom.png" --useBilnear USEBILNEAR Use bilinear interpolation when reprojecting. Valid values are true and false. --outProjection OUTPROJECTION Type of output projection. Valid values are: Equirectangular, Cubemap, SideBySideFisheye --outImage OUTIMAGE output image[s]. List multiple images in double quotes like so "front.png right.png back.png left.png top.png bottom.png" --outWidth OUTWIDTH output image[s] width in pixels --outHeight OUTHEIGHT output image[s] height in pixelsFirst thing to do is to import the vrProjector package:
import vrProjectorNow load up your source projection - you'd do this for equirectangular:
source = vrProjector.EquirectangularProjection() source.loadImage("images/equirectangular.png")or this for a set of cubemap images:
source = vrProjector.CubemapProjection() source.loadImages("front.png", "right.png", "back.png", "left.png", "top.png", "bottom.png")If you want, you can set up the reprojection to bilinearly sample across the surface of the sphere. This improves the quality of low-resolution images a little but leads to a 4x increase in run-time:
source.set_use_bilinear(True)Now create the output projection - in this case side-by-side fisheye - and save the result:
out = vrProjector.SideBySideFisheyeProjection() out.initImage(2048,1024) out.reprojectToThis(source) out.saveImage("sidebysidefisheye.png")Cubemaps are almost the same:
out = vrProjector.CubemapeProjection() out.initImages(1024,1024) out.reprojectToThis(source) out.saveImages("front.png", "right.png", "back.png", "left.png", "top.png", "bottom.png")