12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- #import "GPUImageFilterGroup.h"
- #import "GPUImageThresholdEdgeDetectionFilter.h"
- #import "GPUImageParallelCoordinateLineTransformFilter.h"
- #import "GPUImageThresholdedNonMaximumSuppressionFilter.h"
- #import "GPUImageCannyEdgeDetectionFilter.h"
- // This applies a Hough transform to detect lines in a scene. It starts with a thresholded Sobel edge detection pass,
- // then takes those edge points in and applies a Hough transform to convert them to lines. The intersection of these lines
- // is then determined via blending and accumulation, and a non-maximum suppression filter is applied to find local maxima.
- // These local maxima are then converted back into lines in normal space and returned via a callback block.
- //
- // Rather than using one of the standard Hough transform types, this filter uses parallel coordinate space which is far more efficient
- // to rasterize on a GPU.
- //
- // This approach is based entirely on the PC lines process developed by the Graph@FIT research group at the Brno University of Technology
- // and described in their publications:
- //
- // M. Dubská, J. Havel, and A. Herout. Real-Time Detection of Lines using Parallel Coordinates and OpenGL. Proceedings of SCCG 2011, Bratislava, SK, p. 7.
- // http://medusa.fit.vutbr.cz/public/data/papers/2011-SCCG-Dubska-Real-Time-Line-Detection-Using-PC-and-OpenGL.pdf
- // M. Dubská, J. Havel, and A. Herout. PClines — Line detection using parallel coordinates. 2011 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), p. 1489- 1494.
- // http://medusa.fit.vutbr.cz/public/data/papers/2011-CVPR-Dubska-PClines.pdf
- //#define DEBUGLINEDETECTION
- @interface GPUImageHoughTransformLineDetector : GPUImageFilterGroup
- {
- GPUImageOutput<GPUImageInput> *thresholdEdgeDetectionFilter;
-
- // GPUImageThresholdEdgeDetectionFilter *thresholdEdgeDetectionFilter;
- GPUImageParallelCoordinateLineTransformFilter *parallelCoordinateLineTransformFilter;
- GPUImageThresholdedNonMaximumSuppressionFilter *nonMaximumSuppressionFilter;
-
- GLfloat *linesArray;
- GLubyte *rawImagePixels;
- }
- // A threshold value for which a point is detected as belonging to an edge for determining lines. Default is 0.9.
- @property(readwrite, nonatomic) CGFloat edgeThreshold;
- // A threshold value for which a local maximum is detected as belonging to a line in parallel coordinate space. Default is 0.20.
- @property(readwrite, nonatomic) CGFloat lineDetectionThreshold;
- // This block is called on the detection of lines, usually on every processed frame. A C array containing normalized slopes and intercepts in m, b pairs (y=mx+b) is passed in, along with a count of the number of lines detected and the current timestamp of the video frame
- @property(nonatomic, copy) void(^linesDetectedBlock)(GLfloat* lineArray, NSUInteger linesDetected, CMTime frameTime);
- // These images are only enabled when built with DEBUGLINEDETECTION defined, and are used to examine the intermediate states of the Hough transform
- @property(nonatomic, readonly, strong) NSMutableArray *intermediateImages;
- @end
|