Example Fisheye To Pinhole
From BoofCV
Jump to navigationJump to search
Fisheye lens can allow a view greater than 180 degrees to be seen. This cannot be represented using a pinhole camera and is highly distorted. To allow many vision algorithms to run part of the view needs to be converted into a pinhole camera view.
Example File: ExampleFisheyeToPinhole.java
Concepts:
- Fisheye Cameras
- Camera calibration
Example Code
/**
* Demonstration for how to project a fisheye camera onto a synthetic pinhole camera view. Internally NarrowToWide
* has the following steps. 1) compute normalized image coordinates for each pixel. 2) convert into unit circle
* coordinates, and 3) compute pixe location in fisheye camera.
*
* @author Peter Abeles
*/
public class ExampleFisheyeToPinhole {
public static void main(String[] args) {
// Path to image data and calibration data
String fisheyePath = UtilIO.pathExample("fisheye/theta/");
// load the fisheye camera parameters
CameraUniversalOmni fisheyeModel = CalibrationIO.load(new File(fisheyePath,"front.yaml"));
// Specify what the pinhole camera should look like
CameraPinhole pinholeModel = new CameraPinhole(400,400,0,300,300,600,600);
// Create the transform from pinhole to fisheye views
LensDistortionNarrowFOV pinholeDistort = new LensDistortionPinhole(pinholeModel);
LensDistortionWideFOV fisheyeDistort = new LensDistortionUniversalOmni(fisheyeModel);
NarrowToWidePtoP_F32 transform = new NarrowToWidePtoP_F32(pinholeDistort,fisheyeDistort);
// Load fisheye RGB image
BufferedImage bufferedFisheye = UtilImageIO.loadImage(fisheyePath,"front_table.jpg");
Planar<GrayU8> fisheyeImage = ConvertBufferedImage.convertFrom(
bufferedFisheye, true, ImageType.pl(3,GrayU8.class));
// Create the image distorter which will render the image
InterpolatePixel<Planar<GrayU8>> interp = FactoryInterpolation.
createPixel(0, 255, InterpolateType.BILINEAR, BorderType.ZERO, fisheyeImage.getImageType());
ImageDistort<Planar<GrayU8>,Planar<GrayU8>> distorter =
FactoryDistort.distort(false,interp,fisheyeImage.getImageType());
// Pass in the transform created above
distorter.setModel(new PointToPixelTransform_F32(transform));
// Render the image. The camera will have a rotation of 0 and will thus be looking straight forward
Planar<GrayU8> pinholeImage = fisheyeImage.createNew(pinholeModel.width, pinholeModel.height);
distorter.apply(fisheyeImage,pinholeImage);
BufferedImage bufferedPinhole0 = ConvertBufferedImage.convertTo(pinholeImage,null,true);
// rotate the virtual pinhole camera to the right
transform.setRotationWideToNarrow(ConvertRotation3D_F64.eulerToMatrix(EulerType.YXZ,0.8,0,0,null));
distorter.apply(fisheyeImage,pinholeImage);
BufferedImage bufferedPinhole1 = ConvertBufferedImage.convertTo(pinholeImage,null,true);
// Display the results
ListDisplayPanel panel = new ListDisplayPanel();
panel.addImage(bufferedPinhole0,"Pinehole Forward");
panel.addImage(bufferedPinhole1,"Pinehole Right");
panel.addImage(bufferedFisheye,"Fisheye");
panel.setPreferredSize(new Dimension(600,450));
ShowImages.showWindow(panel, "Fisheye to Pinhole", true);
}
}