---
kind: concept
slug: local-surface-descriptor
title: Local surface descriptors
summary: >-
  A local surface descriptor encodes the 3D shape of a small patch around a keypoint so the same patch matches across noise, mesh resolution changes, occlusion and clutter. One card so far: RoPS, a fixed-scale descriptor of 135 values built on a sign-disambiguated local frame. Its author-reported recognition rates are 100% on Bologna and 98.9% on UWA.
tags: [3d-vision, local-descriptor, object-recognition, point-cloud]
papers: ["1304.3192"]
related: [local-feature-matching]
status: draft
updated_at: 2026-10-19
---

## Overview

A local surface descriptor summarises the geometry of a small patch of a 3D
surface, centred on a feature point. Descriptors are matched between a model
and a scene, and the matches vote for an object pose. The descriptor has to
stay stable under noise, changes in mesh resolution, occlusion and clutter
[arxiv:1304.3192 §1]. Most designs first fix a local reference frame at the
feature point, express the nearby surface in that frame, and then summarise
it. An ambiguous frame, or one that leaves a rotation undefined, weakens the
descriptor [arxiv:1304.3192 §2.1].

This page rests on one card. It covers the RoPS design and its author-reported
numbers. The baseline descriptors the paper compares against have no cards, so
this page does not describe how they work.

## Variants

### RoPS, fixed support radius (the default)

The descriptor takes the neighbourhood of a feature point, expresses it in the
point's local frame [arxiv:1304.3192 §3.1] [arxiv:1304.3192 §3.2], and rotates
it about each frame axis at three angles. Each rotated cloud is projected onto
the three coordinate planes, and each projection is counted in a 5 × 5
histogram. Four central moments and the entropy are kept per histogram. With
5 values, 3 planes, 3 angles and 3 axes, the length is 135
[arxiv:1304.3192 §4.1] [arxiv:1304.3192 tab. 2]. The support radius is 15 mesh
resolutions [arxiv:1304.3192 tab. 2]. Of eight statistics combinations, the
paper picked the one with the four moments and the entropy
[arxiv:1304.3192 §4.2.1] [arxiv:1304.3192 tab. 1]. Card:
[Rotational Projection Statistics for 3D Local Surface Description and Object Recognition](/papers/1304.3192).

### RoPS, adaptive support radius

The paper also reports an adaptive-scale variant, taken from Mian et al. 2010.
It is marginally worse than the fixed 15 mesh-resolution setting, so the
fixed setting is the default [arxiv:1304.3192 §7.2].

### Baseline descriptors

The paper compares spin images, NormHist, LSP, THRIFT, SHOT and 3DSC. It
replaces their original frames with its own frame, so the baseline numbers test
each descriptor together with the new frame [arxiv:1304.3192 §7.1]. In the
tuning step, the paper lists lengths of 225 for spin images, NormHist and LSP,
32 for THRIFT and 320 for SHOT [arxiv:1304.3192 tab. 2]. No cards exist for
these methods.

## When to use which

The table lists the constraints the paper's results address. All numbers are
author-reported.

| Situation | Use | Why |
|---|---|---|
| Noise between 0.1 and 0.5 mesh resolution | RoPS, fixed 15 mr | 100% recognition on Bologna at every noise level in that range [arxiv:1304.3192 §7.1] [fig. 11]. Spin image and NormHist exceed 97% only below 0.1 mr [arxiv:1304.3192 §7.1] |
| Heavy decimation of the scene mesh | RoPS | Bologna at 1/8 decimation: RoPS 100%, NormHist 97.8%, spin image 91.1% [arxiv:1304.3192 §7.1] [fig. 11] |
| Partial occlusion and clutter, as in UWA | RoPS | 98.9% overall. 100% up to 80% occlusion and 93.1% at 85%. 2 of 188 objects missed, no false positives [arxiv:1304.3192 §7.2] |
| Only one correspondence per pose hypothesis is affordable | RoPS with single-correspondence voting | The paper argues one correct match is enough because its frame is reliable [arxiv:1304.3192 §6.3] [arxiv:1304.3192 §7.4]. Frame reliability was measured only on the tuning set, where 83.5% of pairs have error below 10° against 43.2% for the next best method [arxiv:1304.3192 §3.3] [fig. 3] |
| Object scale varies across the scene | Plan a separate scale step | The paper does not handle keypoint scale selection and uses a fixed radius [arxiv:1304.3192 §4.2.4]. The adaptive variant is marginally worse [arxiv:1304.3192 §7.2] |
| Only point clouds, no meshes | Expect the meshing step to matter | The frame is computed on a mesh. Queen's scenes were triangulated in 2-D and models were meshed by marching cubes, so results depend on that step [arxiv:1304.3192 §7.3] |
| Symmetric objects in the scene | Filter by eigenvalue ratio | Feature points whose eigenvalue ratio is close to 1 are dropped [arxiv:1304.3192 §6.2]. The threshold is not stated |
| Tight compute budget | Measure on your own hardware | The paper's per-object times, from MATLAB on 2013 hardware, are 42.6 s for keypoints and frames, 7.2 s for RoPS and 46.6 s for matching [arxiv:1304.3192 §7.3]. They do not carry over |

## Implementation sketch

The sketch follows the paper's frame and descriptor steps, written here in our
own words. Values the paper does not state are marked as choices.

```pseudocode
# Local frame at feature point p  [arxiv:1304.3192 §3.1-§3.2]
def local_frame(p, triangles, r):
    # Weight triangles by area and by closeness to p  [eq. 4-6]
    weights = area_weights(triangles) * closeness_weights(triangles, p, r)
    # Weighted scatter matrix of the surface about p  [eq. 2-4]
    scatter = sum(w * scatter_of(t, p) for w, t in zip(weights, triangles))
    # Axes from the eigen-decomposition, largest eigenvalue first  [eq. 7]
    v1, v2, v3 = eigenvectors_descending(scatter)
    # Eigenvector signs are arbitrary: flip each to point with the mass  [§3.2]
    v1 = v1 * sign(sum(weights * first_moment(triangles, p, v1)))  # [eq. 8-9]
    v3 = v3 * sign(sum(weights * first_moment(triangles, p, v3)))  # [eq. 10]
    # Right-handed frame: the second axis is v3 cross v1  [§3.2]
    v2 = cross(v3, v1)
    return [v1, v2, v3]
```

```pseudocode
# RoPS descriptor for one feature point  [arxiv:1304.3192 §4.1]
def rops(points_in_frame, L=5, T=3):
    values = []
    # Rotate about each frame axis by T angles; the angles are not stated
    for axis in ["x", "y", "z"]:
        for theta in angles(T):  # choice: record the values used
            rotated = rotate(points_in_frame, axis, theta)
            # Project onto the three coordinate planes  [§4.1] [fig. 4]
            for plane in ["xy", "xz", "yz"]:
                # L x L histogram, normalised to sum to one  [§4.1]
                D = normalise(histogram2d(project(rotated, plane), L))
                # Four central moments and the entropy  [§4.2.1] [eq. 12-15]
                values += [mu(D, 1, 1), mu(D, 2, 1), mu(D, 1, 2)]
                values += [mu(D, 2, 2), entropy(D)]
    # 5 values x 3 planes x T angles x 3 axes = 135  [tab. 2]
    return values
```

Points the paper leaves open, and that change every histogram: the angle
values, which in-plane axis is horizontal, how the bounding rectangle is
chosen, how points on bin edges are assigned, and the log base of the entropy
[arxiv:1304.3192 §4.1] [eq. 15]. Record each choice next to the descriptor.

## Contradictions

Only one card, so no cross-paper disagreement is possible. Within the paper:

- **Ca' Foscari.** The abstract gives 96.0%. The body gives 99% precision and
  96% recall [arxiv:1304.3192 §7.4] [arxiv:1304.3192 tab. 7]. The paper does
  not say which figure the abstract reports.
- **UWA.** The body gives 98.9% overall and 98.8% for a second passage limited
  to the occlusion range [arxiv:1304.3192 §7.2]. Report both with that context.

## Papers

- [Rotational Projection Statistics for 3D Local Surface Description and Object Recognition](/papers/1304.3192): RoPS, a descriptor of 135 values built on a sign-disambiguated local frame, with recognition results on four public benchmark sets.
