jAER project on SourceForge

net.sf.jaer.eventprocessing.tracking
Class HoughLineTracker

java.lang.Object
  extended by net.sf.jaer.eventprocessing.EventFilter
      extended by net.sf.jaer.eventprocessing.EventFilter2D
          extended by net.sf.jaer.eventprocessing.tracking.HoughLineTracker
All Implemented Interfaces:
java.util.Observer, LineDetector, FrameAnnotater

public class HoughLineTracker
extends EventFilter2D
implements FrameAnnotater, LineDetector, java.util.Observer

Tracks a single line as used for line-following navigation or for lane tracking.

Origin of the line is center of image. Angle of line is 0 when vertical and positive for clockwise line rotation.

The line is tracked using an incremental Hough transform method. See http://rkb.home.cern.ch/rkb/AN16pp/node122.html for a concise explanation of basic idea of Hough's. Or http://en.wikipedia.org/wiki/Hough_transform. Or http://www.cs.tu-bs.de/rob/lehre/bv/HNF.html for a good interactive java applet demo.

Each point is splatted in its p, theta form into an accumulator array; the array maximum value is computed for each packet and the resulting p,theta values are lowpass filtered to form the output.

Author:
tobi
See Also:
LineDetector

Field Summary
 
Fields inherited from class net.sf.jaer.eventprocessing.EventFilter2D
enclosedFilter, out
 
Fields inherited from class net.sf.jaer.eventprocessing.EventFilter
annotationEnabled, chip, enclosedFilterChain, filterEnabled, log, perf, propertyTooltipMap, support
 
Constructor Summary
HoughLineTracker(AEChip chip)
          Creates a new instance of LineTracker
 
Method Summary
 void annotate(float[][][] frame)
          annotate the RGB frame somehow by color pixels in the rendered pixel frame data.
 void annotate(javax.media.opengl.GLAutoDrawable drawable)
          Each annotator enters annotate with graphics context current, in coordinates with pixel 0,0 in LL corner (note opposite from Java2D) and pixel spacing 1 unit after the scaling transform (which is already active).
 void annotate(java.awt.Graphics2D g)
          each annotator is called by the relevant class (e.g.
 EventPacket<?> filterPacket(EventPacket<?> in)
          Subclasses implement this method to define custom processing.
static java.lang.String getDescription()
           
 float getFavorVerticalAngleRangeDeg()
           
 java.lang.Object getFilterState()
          should return the filter state in some useful form
 float getHoughDecayFactor()
           
 float getRhoPixels()
          returns the Hough line radius of the last packet's estimate - the closest distance from the middle of the chip image.
 float getRhoPixelsFiltered()
          returns the filtered Hough line radius estimate - the closest distance from the middle of the chip image.
 float getRhoResPixels()
           
 float getTauMs()
           
 float getThetaDeg()
          returns the angle of the last packet's Hough line.
 float getThetaDegFiltered()
          returns the filtered angle of the line.
 float getThetaRad()
          returns the angle of the last packet's Hough line.
 float getThetaResDeg()
           
 void initFilter()
          this should allocate and initialize memory: it may be called when the chip e.g.
 boolean isShowHoughWindow()
           
 void resetFilter()
          should reset the filter to initial state
 void setFavorVerticalAngleRangeDeg(float favorVerticalAngleRangeDeg)
           
 void setHoughDecayFactor(float houghDecayFactor)
           
 void setRhoResPixels(float rhoResPixels)
           
 void setShowHoughWindow(boolean showHoughWindow)
           
 void setTauMs(float tauMs)
           
 void setThetaResDeg(float thetaResDeg)
           
 void update(java.util.Observable o, java.lang.Object arg)
           
 
Methods inherited from class net.sf.jaer.eventprocessing.EventFilter2D
checkOutputPacketEventType, checkOutputPacketEventType, getEnclosedFilter, resetOut, setEnclosedFilter, setFilterEnabled
 
Methods inherited from class net.sf.jaer.eventprocessing.EventFilter
getChip, getEnclosedFilterChain, getEnclosingFilter, getPrefs, getPropertyChangeSupport, getPropertyTooltip, isAnnotationEnabled, isEnclosed, isFilterEnabled, prefsEnabledKey, setAnnotationEnabled, setChip, setEnclosed, setEnclosedFilter, setEnclosedFilterChain, setEnclosingFilter, setPreferredEnabledState, setPrefs, setPropertyTooltip
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface net.sf.jaer.graphics.FrameAnnotater
isAnnotationEnabled, setAnnotationEnabled
 

Constructor Detail

HoughLineTracker

public HoughLineTracker(AEChip chip)
Creates a new instance of LineTracker

Parameters:
chip - the chip to track for
Method Detail

getDescription

public static java.lang.String getDescription()

getRhoPixels

public float getRhoPixels()
returns the Hough line radius of the last packet's estimate - the closest distance from the middle of the chip image.

Returns:
the distance in pixels. If the chip size is sx by sy, can range over +-Math.sqrt( (sx/2)^2 + (sy/2)^2). This number is positive if the line is above the origin (center of chip)

getThetaDeg

public float getThetaDeg()
returns the angle of the last packet's Hough line.

Returns:
angle in degrees. Ranges from 0 to 180 degrees, where 0 and 180 represent a vertical line and 90 is a horizontal line

getThetaRad

public float getThetaRad()
returns the angle of the last packet's Hough line.

Returns:
angle in radians. Ranges from 0 to Pi radians, where 0 and Pi represent a vertical line and Pi/2 is a horizontal line

resetFilter

public void resetFilter()
Description copied from class: EventFilter
should reset the filter to initial state

Specified by:
resetFilter in class EventFilter

filterPacket

public EventPacket<?> filterPacket(EventPacket<?> in)
Description copied from class: EventFilter2D
Subclasses implement this method to define custom processing.

Specified by:
filterPacket in class EventFilter2D
Parameters:
in - the input packet
Returns:
the output packet

annotate

public void annotate(javax.media.opengl.GLAutoDrawable drawable)
Description copied from interface: FrameAnnotater
Each annotator enters annotate with graphics context current, in coordinates with pixel 0,0 in LL corner (note opposite from Java2D) and pixel spacing 1 unit after the scaling transform (which is already active). The FrameAnnotater then can use JOGL calls to render to the screen by getting the GL context, e.g. the following code, used in the context of an AEChip object, draws a golden lines from LL to UR of the pixel array.
        GL gl = drawable.getGL();
        gl.glBegin(GL.GL_LINES);
        gl.glColor3f(.5f, .5f, 0);
        gl.glVertex2f(0, 0);
        gl.glVertex2f(getSizeX() - 1, getSizeY() - 1);
        gl.glEnd();
 

Specified by:
annotate in interface FrameAnnotater
Parameters:
drawable - the OpenGL drawable components, e.g., GLCanvas

getFilterState

public java.lang.Object getFilterState()
Description copied from class: EventFilter
should return the filter state in some useful form

Specified by:
getFilterState in class EventFilter

initFilter

public void initFilter()
Description copied from class: EventFilter
this should allocate and initialize memory: it may be called when the chip e.g. size parameters are changed after creation of the filter

Specified by:
initFilter in class EventFilter

annotate

public void annotate(float[][][] frame)
Description copied from interface: FrameAnnotater
annotate the RGB frame somehow by color pixels in the rendered pixel frame data.

Specified by:
annotate in interface FrameAnnotater
Parameters:
frame - the RGB pixel information. First dimension is Y, second is X, third is RGB

annotate

public void annotate(java.awt.Graphics2D g)
Description copied from interface: FrameAnnotater
each annotator is called by the relevant class (e.g. EyeTracker) and enters annotate with graphics context current, in coordinates with pixel 0,0 in UL corner and pixel spacing 1 unit before scaling transform (which is already active).

Specified by:
annotate in interface FrameAnnotater
Parameters:
g - the Graphics2D context

getThetaResDeg

public float getThetaResDeg()

setThetaResDeg

public void setThetaResDeg(float thetaResDeg)

getRhoResPixels

public float getRhoResPixels()

setRhoResPixels

public void setRhoResPixels(float rhoResPixels)

getTauMs

public float getTauMs()

setTauMs

public void setTauMs(float tauMs)

isShowHoughWindow

public boolean isShowHoughWindow()

setShowHoughWindow

public void setShowHoughWindow(boolean showHoughWindow)

getRhoPixelsFiltered

public float getRhoPixelsFiltered()
returns the filtered Hough line radius estimate - the closest distance from the middle of the chip image.

Specified by:
getRhoPixelsFiltered in interface LineDetector
Returns:
the distance in pixels. If the chip size is sx by sy, can range over +-Math.sqrt( (sx/2)^2 + (sy/2)^2). This number is positive if the line is above the origin (center of chip)

getThetaDegFiltered

public float getThetaDegFiltered()
returns the filtered angle of the line.

Specified by:
getThetaDegFiltered in interface LineDetector
Returns:
angle in degrees. Ranges from 0 to 180 degrees, where 0 and 180 represent a vertical line and 90 is a horizontal line

update

public void update(java.util.Observable o,
                   java.lang.Object arg)
Specified by:
update in interface java.util.Observer

getFavorVerticalAngleRangeDeg

public float getFavorVerticalAngleRangeDeg()

setFavorVerticalAngleRangeDeg

public void setFavorVerticalAngleRangeDeg(float favorVerticalAngleRangeDeg)

getHoughDecayFactor

public float getHoughDecayFactor()

setHoughDecayFactor

public void setHoughDecayFactor(float houghDecayFactor)

jAER project on SourceForge