Example Equirectangular To Pinhole

Equirectangular images encode a full 360 view inside a rectangular image. This creates a highly distorted view, which can be visually displeasing and can't be processed directly by computer vision algorithms. Part of the view can be rendered inside a synthetic pinhole camera. The synthetic view could then be feed to fiducial detection algorithms, SFM, ... etc. This example shows to generate the synthetic pinhole camera view at an arbtirary orientation and intrinsic parameters.

Example Code

/** * Demonstration for how to project a synthetic pinhole camera view given an equirectangular image. To * specify the projection the camera model needs to be configured and the orientation of the view needs to bet set. * * @author Peter Abeles */publicclassExampleEquirectangularToPinhole{publicstaticvoidmain(String[]args){// Specify what the pinhole camera should look likeCameraPinholepinholeModel=newCameraPinhole(200,200,0,250,250,500,500);// Load equirectangular RGB imageBufferedImagebufferedEqui=UtilImageIO.loadImage(UtilIO.pathExample("spherical/equirectangular_half_dome_01.jpg"));Planar<GrayU8>equiImage=ConvertBufferedImage.convertFrom(bufferedEqui,true,ImageType.pl(3,GrayU8.class));// Declare storage for pinhole camera imagePlanar<GrayU8>pinholeImage=equiImage.createNew(pinholeModel.width,pinholeModel.height);// Create the image distorter which will render the imageInterpolatePixel<Planar<GrayU8>>interp=FactoryInterpolation.createPixel(0,255,InterpolationType.BILINEAR,BorderType.EXTENDED,equiImage.getImageType());ImageDistort<Planar<GrayU8>,Planar<GrayU8>>distorter=FactoryDistort.distort(false,interp,equiImage.getImageType());// This is where the magic is done. It defines the transform rfom equirectangular to pinholeCameraToEquirectangular_F32pinholeToEqui=newCameraToEquirectangular_F32();pinholeToEqui.setEquirectangularShape(equiImage.width,equiImage.height);pinholeToEqui.setCameraModel(pinholeModel);// Pass in the transform to the image distorterdistorter.setModel(pinholeToEqui);// change the orientation of the camera to make the view betterConvertRotation3D_F32.eulerToMatrix(EulerType.YXZ,0,1.45f,2.2f,pinholeToEqui.getRotation());// Render the imagedistorter.apply(equiImage,pinholeImage);BufferedImagebufferedPinhole0=ConvertBufferedImage.convertTo(pinholeImage,null,true);// Let's look at another viewConvertRotation3D_F32.eulerToMatrix(EulerType.YXZ,0,1.25f,-1.25f,pinholeToEqui.getRotation());distorter.apply(equiImage,pinholeImage);BufferedImagebufferedPinhole1=ConvertBufferedImage.convertTo(pinholeImage,null,true);// Display the resultsListDisplayPanelpanel=newListDisplayPanel();panel.addImage(bufferedPinhole0,"Pinehole View 0");panel.addImage(bufferedPinhole1,"Pinehole View 1");panel.addImage(bufferedEqui,"Equirectangular");panel.setPreferredSize(newDimension(equiImage.width,equiImage.height));ShowImages.showWindow(panel,"Equirectangular to Pinhole",true);}}