Example Detect Lines
Detect Interest Point Example
Lines are commonly found in man made environments. They can often be detected in location where other feature cannot due to the environments sparsity. Typical applications are for location targets and for evaluating the 3D structure of a building. Mathematically, a line has no end points and a line detector in BoofCV does not detect end points either. BoofCV does provide ways to detect line segments, which are lines with a beginning and end.
Line and line segment detection is still under development. No highly abstract and simplified interface is provided yet. Even though its under development still, these algorithms are still effective at detecting lines and line segments.
WARNING: Example code below works with latest repository code, but not the last release. Minor refactoring is required to make it work with v0.2
Example Code:
Concepts:
- Line detection
- Line segment detection
Relevant Applets:
Example Code
public class ExampleLineDetection {
// adjusts edge threshold for identifying pixels belonging to a line
private static final float edgeThreshold = 25;
// adjust the maximum number of found lines in the image
private static final int maxLines = 10;
/**
* Detects lines inside the image using different types of Hough detectors
*
* @param image Input image.
* @param imageType Type of image processed by line detector.
* @param derivType Type of image derivative.
*/
public static<T extends ImageSingleBand, D extends ImageSingleBand>
void detectLines( BufferedImage image ,
Class<T> imageType ,
Class<D> derivType )
{
// convert the line into a single band image
T input = ConvertBufferedImage.convertFromSingle(image, null, imageType );
// Comment/uncomment to try a different type of line detector
DetectLineHoughPolar<T,D> detector = FactoryDetectLineAlgs.houghPolar(3, 30, 2, Math.PI / 180,
edgeThreshold, maxLines, imageType, derivType);
// DetectLineHoughFoot<T,D> detector = FactoryDetectLineAlgs.houghFoot(3, 8, 5, edgeThreshold,
// maxLines, imageType, derivType);
// DetectLineHoughFootSubimage<T,D> detector = FactoryDetectLineAlgs.houghFootSub(3, 8, 5, edgeThreshold,
// maxLines, 2, 2, imageType, derivType);
List<LineParametric2D_F32> found = detector.detect(input);
// display the results
ImageLinePanel gui = new ImageLinePanel();
gui.setBackground(image);
gui.setLines(found);
gui.setPreferredSize(new Dimension(image.getWidth(),image.getHeight()));
ShowImages.showWindow(gui,"Found Lines");
}
/**
* Detects segments inside the image
*
* @param image Input image.
* @param imageType Type of image processed by line detector.
* @param derivType Type of image derivative.
*/
public static<T extends ImageSingleBand, D extends ImageSingleBand>
void detectLineSegments( BufferedImage image ,
Class<T> imageType ,
Class<D> derivType )
{
// convert the line into a single band image
T input = ConvertBufferedImage.convertFromSingle(image, null, imageType );
// Comment/uncomment to try a different type of line detector
DetectLineSegmentsGridRansac<T,D> detector = FactoryDetectLineAlgs.lineRansac(40, 30, 2.36, true, imageType, derivType);
List<LineSegment2D_F32> found = detector.detect(input);
// display the results
ImageLinePanel gui = new ImageLinePanel();
gui.setBackground(image);
gui.setLineSegments(found);
gui.setPreferredSize(new Dimension(image.getWidth(),image.getHeight()));
ShowImages.showWindow(gui,"Found Line Segments");
}
public static void main( String args[] ) {
BufferedImage input = UtilImageIO.loadImage("../data/evaluation/simple_objects.jpg");
detectLines(input,ImageUInt8.class,ImageSInt16.class);
// line segment detection is still under development and only works for F32 images right now
detectLineSegments(input, ImageFloat32.class, ImageFloat32.class);
}
}