import { FaceDetection } from '../classes/FaceDetection'; import { FaceLandmarks } from '../classes/FaceLandmarks'; import { FaceLandmarks68 } from '../classes/FaceLandmarks68'; import { isWithFaceDetection, WithFaceDetection } from './WithFaceDetection'; export type WithFaceLandmarks< TSource extends WithFaceDetection<{}>, TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 > = TSource & { landmarks: TFaceLandmarks unshiftedLandmarks: TFaceLandmarks alignedRect: FaceDetection } export function isWithFaceLandmarks(obj: any): obj is WithFaceLandmarks, FaceLandmarks> { return isWithFaceDetection(obj) // eslint-disable-next-line dot-notation && obj['landmarks'] instanceof FaceLandmarks // eslint-disable-next-line dot-notation && obj['unshiftedLandmarks'] instanceof FaceLandmarks // eslint-disable-next-line dot-notation && obj['alignedRect'] instanceof FaceDetection; } export function extendWithFaceLandmarks< TSource extends WithFaceDetection<{}>, TFaceLandmarks extends FaceLandmarks = FaceLandmarks68 >(sourceObj: TSource, unshiftedLandmarks: TFaceLandmarks): WithFaceLandmarks { const { box: shift } = sourceObj.detection; const landmarks = unshiftedLandmarks.shiftBy(shift.x, shift.y); const rect = landmarks.align(); const { imageDims } = sourceObj.detection; const alignedRect = new FaceDetection(sourceObj.detection.score, rect.rescale(imageDims.reverse()), imageDims); const extension = { landmarks, unshiftedLandmarks, alignedRect, }; return { ...sourceObj, ...extension }; }