Example Fisheye To Pinhole

From BoofCV
Revision as of 08:28, 17 August 2017 by Peter (talk | contribs)
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

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, InterpolationType.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_F32.eulerToMatrix(EulerType.YXZ,0.8f,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);
	}
}