# Shape context

Calculates the shape context descriptor for a set of points that describe the shape of an object. The shape context descriptor is given a large set of points that describes the shape and a (usually) smaller set of key points at which the feature vectors (descriptors) will be calculated.

The feature vector collects the locations of the other points of the object as seen from a key point into a two-dimensional polar histogram. At each key point, the direction and distance of every point in *points* is calculated. A two-dimensional histogram bin index is found by quantizing direction and distance to a predefined number of discrete levels.

Usually, the input for this tool is generated using boundary detection. The shape context descriptor can however be extracted from any arbitrary set of points. If rotational invariance is needed, local shape orientation must be provided.

The descriptor can be made invariant against scaling and rotation. An invariant descriptor is necessarily less descriptive and slightly slower to calculate. Thus, if it is known that the orientation or size of the target objects doesn't change, best performance is obtained by not enabling the invariance options.

This tool rarely needs to be used explicitly. Boundary shape detection provides a more user-friendly interface.

## Inputs

- points
- A set of points that form the boundaries of an object in an image. Each row in the matrix contains the (x, y) world coordinates of a point.

- keyPoints
- A selected set of points at which the local shape descriptors are collected. The key points are usually a subset of
*points*, but need not be. If key points are not provided,*points*will be used as key points.

- orientations
- Local shape orientation for each key point in radians. If this input is connected, the resulting key point descriptors will be normalized along the provided orientations. This input must be a 1-by-N matrix, where N is the number of rows in
*keyPoints*(if connected) or*points*. If this parameter is connected, the resulting descriptors will be rotationally invariant.

- scaleInvariant
- Enables and disables scale invariance. If scale invariance is enabled, distances are normalized by dividing them by the (approximate) mean distance between point pairs.

- angleBins
- The number of quantization bins for angle in the polar histogram. The width of each sector will be 360° /
*angleBins*.

- distanceBins
- The number of quantization bins for distance in the polar coordinate system. The size of each distance bin will grow exponentially based on
*firstAbsoluteDistance*and*distanceScale*. The total length of each key point descriptor will be*angleBins***distanceBins*.

- firstAbsoluteDistance
- Absolute size of the first quantization bin for distance. Distance is quantized to exponentially growing bins. Everything closer than
*firstAbsoluteDistance*will be put into the first distance bin. The distance is expressed as an absolute measurement in world coordinates and it will be used if the*scaleInvariant*flag is`false`

. Note that setting*firstAbsoluteDistance*to zero produces an empty descriptor.

- firstRelativeDistance
- Relative size of the first quantization bin for distance. This parameter has the same effect as
*firstAbsoluteDistance*, but it is relative to the mean distance between points in a shape. For example, 0.1 means that the first distance bin will cover 10% of the mean distance. This parameter will be used if*scaleInvariant*is`true`

. If this value is set to zero, the tool automatically picks a value that scales the distance bins so that the last one just reaches the mean distance between point pairs.

- distanceScale
- A scaling factor for the exponentially growing distance bins. If the first distance (either
*firstAbsoluteDistance*or*firstRelativeDistance*depending on*scaleInvariant*) is denoted by*f*, the first distance bin will be from zero to*f*. The second one will be from*f*to*f***distanceScale*and so on. The last bin will be from*f***distanceScale*^ (*distanceBins*- 2) to*f***distanceScale*^ (*distanceBins*- 1).

- globalDescriptor
- A flag that controls how to treat points whose distance to the key point is greater than the reach of the last distance bin (distance is greater than
*f***distanceScale*^ (*distanceBins*- 1)). If this flag is`true`

, all these points will be collected to the last distance bin. If the value is`false`

, they will be discarded. This makes it possible to switch between a local and global descriptor. A global descriptor may provide more accuracy if it is known that there are no occlusions or overlapping objects. Otherwise, a local descriptor is better as it is more likely to collect points from a single object.

- maxSamplesPerKeyPoint
- The maximum number of samples on the contour to collect for each key point. This parameter poses a hard upper limit for the processing time for the algorithm. If every point on a contour was considered, a total number of points.rows * keyPoints.rows point pairs would need to be evaluated. This would make processing of long contours really heavy. This parameter sets an upper limit to the number of evaluations, after which the contour will be uniformly subsampled to reduce the computational burden. Even if
*maxSamplesPerKeyPoint*is set to a small value, the algorithm will take at least*angleBins***distanceBins*samples for each key point. Setting*maxSamplesPerKeyPoint*to zero removes the upper bound.

## Outputs

- features
- A polar histogram of point locations for each key point. The number of rows in the feature matrix is the same as that of the
*keyPoints*input. Each row contains a two-dimensional polar histogram that is folded into a one-dimensional vector with*angleBins***distanceBins*entries. The sum of each histogram is normalized to one.