@vladmandic/human
Version:
Human: AI-powered 3D Face Detection & Rotation Tracking, Face Description & Recognition, Body Pose Tracking, 3D Hand & Finger Tracking, Iris Analysis, Age & Gender & Emotion Prediction, Gesture Recognition
29 lines (26 loc) • 1.9 kB
text/typescript
import type { FaceResult } from '../result';
export function calculateCameraDistance(face: FaceResult, width: number): number {
// iris points are [center, left, top, right, bottom]
// average size of human iris is 11.7mm - fairly constant for all ages/genders/races
const f = face?.annotations;
if (!f?.leftEyeIris || !f?.rightEyeIris) return 0;
// get size of left and right iris in pixels, pick larger one as its likely to be more accurate and normalize to 0..1 range instead of pixels
const irisSize = Math.max(Math.abs(f.leftEyeIris[3][0] - f.leftEyeIris[1][0]), Math.abs(f.rightEyeIris[3][0] - f.rightEyeIris[1][0])) / width;
// distance of eye from camera in meters
const cameraDistance = Math.round(1.17 / irisSize) / 100;
return cameraDistance;
}
export function calculateEyesDistance(face: FaceResult, width: number): number {
// average distance between eyes is 65mm - fairly constant for typical adult male, but varies otherwise
const f = face?.annotations;
if (!f?.leftEyeIris || !f?.rightEyeIris) return 0;
// get size of left and right iris in pixels, pick larger one as its likely to be more accurate and normalize to 0..1 range instead of pixels
const irisSize = Math.max(Math.abs(f.leftEyeIris[3][0] - f.leftEyeIris[1][0]), Math.abs(f.rightEyeIris[3][0] - f.rightEyeIris[1][0])) / width;
// pixel x and y distance of centers of left and right iris, you can use edges instead
const irisDistanceXY = [f.leftEyeIris[0][0] - f.rightEyeIris[0][0], f.leftEyeIris[0][1] - f.rightEyeIris[0][1]];
// absolute distance bewtween eyes in 0..1 range to account for head pitch (we can ignore yaw)
const irisDistance = Math.sqrt((irisDistanceXY[0] * irisDistanceXY[0]) + (irisDistanceXY[1] * irisDistanceXY[1])) / width;
// distance between eyes in meters
const eyesDistance = Math.round(1.17 * irisDistance / irisSize) / 100;
return eyesDistance;
}