Source code for bob.bio.face.annotator.bobipflandmark

from . import Base
import bob.ip.color
import bob.ip.flandmark


class BobIpFlandmark(Base):
    """Annotator using bob.ip.flandmark.
    This annotator needs the topleft and bottomright annotations provided.

    Example usage:

    .. doctest::

        >>> from bob.bio.base.annotator import FailSafe
        >>> from bob.bio.face.annotator import (
        ...     BobIpFacedetect, BobIpFlandmark)
        >>> annotator = FailSafe(
        ...     [BobIpFacedetect(), BobIpFlandmark()],
        ...     required_keys=('reye', 'leye'))
    """

    def __init__(self, **kwargs):
        super(BobIpFlandmark, self).__init__(**kwargs)
        self.flandmark = bob.ip.flandmark.Flandmark()

[docs] def annotate(self, image, annotations, **kwargs): """Annotates an image. Parameters ---------- image : array Image in Bob format RGB. annotations : dict The topleft and bottomright annotations are required. **kwargs Ignored. Returns ------- dict Annotations with reye and leye keys or None if it fails. """ if image.ndim == 3: image = bob.ip.color.rgb_to_gray(image) top, left = annotations['topleft'] top, left = int(max(top, 0)), int(max(left, 0)) height = annotations['bottomright'][0] - top width = annotations['bottomright'][1] - left height, width = min(height, image.shape[0]), min(width, image.shape[1]) height, width = int(height), int(width) landmarks = self.flandmark.locate(image, top, left, height, width) if landmarks is not None and len(landmarks): return { 'reye': ((landmarks[1][0] + landmarks[5][0]) / 2., (landmarks[1][1] + landmarks[5][1]) / 2.), 'leye': ((landmarks[2][0] + landmarks[6][0]) / 2., (landmarks[2][1] + landmarks[6][1]) / 2.) } else: return None