Source code for entente.landmarks.landmark_compositor
import numpy as np
from .landmarker import Landmarker
[docs]class LandmarkCompositor(object):
"""
A tool for compositing landmarks from several examples in relation to
a base mesh. Each example is projected onto the base mesh, then the
points are averaged.
The tool takes as input:
- A base mesh
- Several examples
- Mesh (in correspondence with the base mesh)
- xyz coordinates for one or more landmarks
And will output:
- The xyz coordinates of the comosite landmark on the base mesh
"""
def __init__(self, base_mesh, landmark_names):
self.base_mesh = base_mesh
self.landmark_names = set(landmark_names)
self.examples = []
[docs] def add_example(self, mesh, landmarks):
# By processing one mesh at a time, they don't all need to be loaded
# into memory.
if not set(landmarks.keys()).issuperset(self.landmark_names):
raise ValueError(
"Expected examples to contain keys {}".format(
", ".join(self.landmark_names)
)
)
landmarker = Landmarker(source_mesh=mesh, landmarks=landmarks)
transferred = landmarker.transfer_landmarks_onto(self.base_mesh)
self.examples.append(transferred)
@property
def result(self):
return {
name: np.average(
[example[name] for example in self.examples], axis=0
).tolist()
for name in self.landmark_names
}