from collections import OrderedDict
import numpy as np
from ..base import labeller_func, validate_input, connectivity_from_array
[docs]@labeller_func(group_label='face_bu3dfe_83')
def face_bu3dfe_83_to_face_bu3dfe_83(pcloud):
r"""
Apply the BU-3DFE (Binghamton University 3D Facial Expression)
Database 83-point facial semantic labels.
The semantic labels applied are as follows:
- right_eye
- left_eye
- right_eyebrow
- left_eyebrow
- right_nose
- left_nose
- nostrils
- outer_mouth
- inner_mouth
- jaw
References
----------
.. [1] http://www.cs.binghamton.edu/~lijun/Research/3DFE/3DFE_Analysis.html
"""
from menpo.shape import LabelledPointUndirectedGraph
n_expected_points = 83
validate_input(pcloud, n_expected_points)
reye_indices = np.arange(0, 8)
leye_indices = np.arange(8, 16)
rbrow_indices = np.arange(16, 26)
lbrow_indices = np.arange(26, 36)
rnose_indices = np.arange(36, 39)
lnose_indices = np.arange(39, 42)
nostril_indices = np.arange(42, 48)
outermouth_indices = np.arange(48, 60)
innermouth_indices = np.arange(60, 68)
jaw_indices = np.arange(68, 83)
reye_connectivity = connectivity_from_array(reye_indices, close_loop=True)
leye_connectivity = connectivity_from_array(leye_indices, close_loop=True)
rbrow_connectivity = connectivity_from_array(rbrow_indices,
close_loop=True)
lbrow_connectivity = connectivity_from_array(lbrow_indices,
close_loop=True)
rnose_connectivity = connectivity_from_array(rnose_indices)
nostril_connectivity = connectivity_from_array(nostril_indices)
lnose_connectivity = connectivity_from_array(lnose_indices)
outermouth_connectivity = connectivity_from_array(outermouth_indices,
close_loop=True)
innermouth_connectivity = connectivity_from_array(innermouth_indices,
close_loop=True)
jaw_connectivity = connectivity_from_array(jaw_indices)
all_connectivity = np.vstack([
reye_connectivity, leye_connectivity,
rbrow_connectivity, lbrow_connectivity,
rnose_connectivity, nostril_connectivity, lnose_connectivity,
outermouth_connectivity, innermouth_connectivity,
jaw_connectivity
])
mapping = OrderedDict()
mapping['right_eye'] = reye_indices
mapping['left_eye'] = leye_indices
mapping['right_eyebrow'] = rbrow_indices
mapping['left_eyebrow'] = lbrow_indices
mapping['right_nose'] = rnose_indices
mapping['left_nose'] = lnose_indices
mapping['nostrils'] = nostril_indices
mapping['outer_mouth'] = outermouth_indices
mapping['inner_mouth'] = innermouth_indices
mapping['jaw'] = jaw_indices
new_pcloud = LabelledPointUndirectedGraph.init_from_indices_mapping(
pcloud.points, all_connectivity, mapping)
return new_pcloud, mapping