Example Fisheye To Pinhole

From BoofCV
Revision as of 22:25, 1 December 2016 by Peter (talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, 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


  • Fisheye Cameras
  • Camera calibration

Related Examples:

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 =

		// 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);

		BufferedImage bufferedPinhole0 = ConvertBufferedImage.convertTo(pinholeImage,null,true);

		// rotate the virtual pinhole camera to the right

		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.setPreferredSize(new Dimension(600,450));

		ShowImages.showWindow(panel, "Fisheye to Pinhole", true);