Difference between revisions of "Example Remove Perspective Distortion"

From BoofCV
Jump to navigationJump to search
m
m
Line 9: Line 9:


Example Code:
Example Code:
* [https://github.com/lessthanoptimal/BoofCV/blob/v0.16/examples/src/boofcv/examples/geometry/ExampleRemovePerspectiveDistortion.java ExampleRemovePerspectiveDistortion.java]
* [https://github.com/lessthanoptimal/BoofCV/blob/v0.19/examples/src/boofcv/examples/geometry/ExampleRemovePerspectiveDistortion.java ExampleRemovePerspectiveDistortion.java]


Concepts:
Concepts:
Line 58: Line 58:


// Apply distortion and show the results
// Apply distortion and show the results
DistortImageOps.distortMS(input,output,pixelTransform,true, TypeInterpolate.BILINEAR);
DistortImageOps.distortMS(input,output,pixelTransform, null, TypeInterpolate.BILINEAR);


BufferedImage flat = ConvertBufferedImage.convertTo_F32(output,null,true);
BufferedImage flat = ConvertBufferedImage.convertTo_F32(output,null,true);
ShowImages.showWindow(buffered,"Original Image");
ShowImages.showWindow(buffered,"Original Image",true);
ShowImages.showWindow(flat,"Without Perspective Distortion");
ShowImages.showWindow(flat,"Without Perspective Distortion",true);
}
}
}
}
</syntaxhighlight>
</syntaxhighlight>

Revision as of 11:01, 19 September 2015

It is often easier to process an image after perspective distortion is removed. The billboard in this example is at an acute angle relative to the camera, making its text hard to read. A homography can be created, using the for cornerns of the billboard, and used to remove this distortion.

Example Code:

Concepts:

  • Homography
  • Perpsective
  • Distortion

Relevant Examples:

Example Code

/**
 * Certain image processing techniques, such as Optical Character Recognition (OCR), can be performed better if
 * perspective distortion is remove from an image.  In this example a homography is computed from the cour corners
 * of a bulletin board and the image is projected into a square image without perspective distortion.
 *
 * @author Peter Abeles
 */
public class ExampleRemovePerspectiveDistortion {
	public static void main(String[] args) {

		// load a color image
		BufferedImage buffered = UtilImageIO.loadImage("../data/applet/goals_and_stuff.jpg");
		MultiSpectral<ImageFloat32> input = ConvertBufferedImage.convertFromMulti(buffered, null, true, ImageFloat32.class);

		// Create a smaller output image for processing later on
		MultiSpectral<ImageFloat32> output = input._createNew(400,500);

		// Homography estimation algorithm.  Requires a minimum of 4 points
		Estimate1ofEpipolar computeHomography = FactoryMultiView.computeHomography(true);

		// Specify the pixel coordinates from destination to target
		ArrayList<AssociatedPair> associatedPairs = new ArrayList<AssociatedPair>();
		associatedPairs.add(new AssociatedPair(new Point2D_F64(0,0),new Point2D_F64(267,182)));
		associatedPairs.add(new AssociatedPair(new Point2D_F64(output.width-1,0),new Point2D_F64(542,68)));
		associatedPairs.add(new AssociatedPair(new Point2D_F64(output.width-1,output.height-1),new Point2D_F64(519,736)));
		associatedPairs.add(new AssociatedPair(new Point2D_F64(0,output.height-1),new Point2D_F64(276,570)));

		// Compute the homography
		DenseMatrix64F H = new DenseMatrix64F(3,3);
		computeHomography.process(associatedPairs, H);

		// Create the transform for distorting the image
		PointTransformHomography_F32 homography = new PointTransformHomography_F32(H);
		PixelTransform_F32 pixelTransform = new PointToPixelTransform_F32(homography);

		// Apply distortion and show the results
		DistortImageOps.distortMS(input,output,pixelTransform, null, TypeInterpolate.BILINEAR);

		BufferedImage flat = ConvertBufferedImage.convertTo_F32(output,null,true);
		ShowImages.showWindow(buffered,"Original Image",true);
		ShowImages.showWindow(flat,"Without Perspective Distortion",true);
	}
}