face-detection-web-sdk
Version:
웹 기반 얼굴 인식을 통해 실시간으로 심박수, 스트레스, 혈압 등의 건강 정보를 측정하는 SDK
217 lines (216 loc) • 6.72 kB
TypeScript
export interface BoundingBox {
xCenter: number;
yCenter: number;
width: number;
height: number;
}
export interface Detection {
boundingBox: BoundingBox;
}
export interface CalculatedBoundingBox {
left: number;
top: number;
width: number;
height: number;
}
export interface FacePositionResult {
isInCircle: boolean;
distance: number;
allowedRadius: number;
progressCenter: {
x: number;
y: number;
};
}
export interface PositionUpdateResult {
positionErr: number;
yPositionErr: number;
lastPosition: number;
lastYPosition: number;
}
export interface RgbDataObject {
sigR: number[];
sigG: number[];
sigB: number[];
timestamp: number[];
}
export interface LastRGB {
timestamp: number;
r: number | null;
g: number | null;
b: number | null;
}
export interface FaceDetectionResults {
detections?: Detection[];
image: {
width: number;
height: number;
};
}
export interface ProcessContext {
isFirstFrame: boolean;
isFaceDetected: boolean;
faceDetectionTimer: NodeJS.Timeout | null;
FACE_DETECTION_TIMEOUT: number;
handleFaceDetection: (detection: Detection) => void;
handleNoDetection: () => void;
mean_red: number[];
}
export interface ProcessResultsReturn {
isFirstFrame: boolean;
isFaceDetected: boolean;
faceDetectionTimer: NodeJS.Timeout | null;
lastBoundingBox: CalculatedBoundingBox | null;
}
export interface PlatformOptions {
isIOS?: boolean;
isAndroid?: boolean;
}
export interface StateChangeCallback {
(newState: FaceDetectionState, previousState: FaceDetectionState): void;
}
/**
* 얼굴 인식 SDK 설정 인터페이스
*/
export interface FaceDetectionSDKConfig {
/** 플랫폼 옵션 */
platform?: PlatformOptions;
/** 측정 설정 */
measurement?: {
/** 목표 데이터 포인트 수 (기본값: 450) */
targetDataPoints?: number;
/** 프레임 처리 간격 (기본값: 33.33ms) */
frameInterval?: number;
/** 프레임 처리 주기 (기본값: 30) */
frameProcessInterval?: number;
/** ready 상태에서 measuring 상태로 전환하기 전 대기 시간 (초, 기본값: 3) */
readyToMeasuringDelay?: number;
};
/** 얼굴 인식 설정 */
faceDetection?: {
/** 얼굴 인식 타임아웃 (기본값: 3000ms) */
timeout?: number;
/** 최소 감지 신뢰도 (기본값: 0.5) */
minDetectionConfidence?: number;
};
/** 비디오 설정 */
video?: {
/** 비디오 너비 (기본값: 640) */
width?: number;
/** 비디오 높이 (기본값: 480) */
height?: number;
/** 프레임레이트 (기본값: 30) */
frameRate?: number;
};
/** UI 설정 */
ui?: {
/** 컨테이너 요소 ID (기본값: 'face-detection-container') */
containerId?: string;
/** 커스텀 CSS 클래스 */
customClasses?: {
container?: string;
video?: string;
canvas?: string;
progress?: string;
};
};
/** HTML 요소들 (사용자가 직접 제공) */
elements?: {
/** 비디오 요소 */
video: HTMLVideoElement;
/** 출력 캔버스 요소 */
canvasElement: HTMLCanvasElement;
/** 비디오 캔버스 요소 */
videoCanvas: HTMLCanvasElement;
/** 컨테이너 요소 */
container: HTMLElement;
};
/** 서버 설정 */
server?: {
/** API 기본 URL */
baseUrl?: string;
/** 요청 타임아웃 (기본값: 30000ms) */
timeout?: number;
};
/** 디버그 설정 */
debug?: {
/** 디버그 모드 활성화 (기본값: false) */
enabled?: boolean;
/** 콘솔 로그 활성화 (기본값: false) */
enableConsoleLog?: boolean;
};
/** 데이터 다운로드 설정 */
dataDownload?: {
/** 데이터 다운로드 활성화 (기본값: false) */
enabled?: boolean;
/** 자동 다운로드 여부 (기본값: false, false면 새 창에서 사용자 입력으로 다운로드) */
autoDownload?: boolean;
/** 다운로드 파일명 (기본값: 'rgb_data.txt') */
filename?: string;
};
/** 에러 바운딩 값 */
errorBounding?: number;
}
export declare enum FaceDetectionState {
INITIAL = "initial",// 초기 상태 (초기화, 준비, 얼굴 위치 조정 등 모든 초기 과정 포함)
READY = "ready",// 측정 준비 완료
MEASURING = "measuring",// 측정 중 (RGB 데이터 수집)
COMPLETED = "completed"
}
export declare enum FaceDetectionErrorType {
FACE_NOT_DETECTED = "face_not_detected",// 얼굴 인식 실패
FACE_OUT_OF_CIRCLE = "face_out_of_circle",// 얼굴이 원 밖에 위치
WEBCAM_PERMISSION_DENIED = "webcam_permission_denied",// 웹캠 권한 거부
WEBCAM_ACCESS_FAILED = "webcam_access_failed",// 웹캠 접근 실패
INITIALIZATION_FAILED = "initialization_failed",// 초기화 실패
UNKNOWN_ERROR = "unknown_error"
}
export interface FaceDetectionError {
type: FaceDetectionErrorType;
message: string;
}
/**
* 측정 결과 인터페이스
*/
export interface MeasurementResult {
/** 심박수 */
heartRate?: number;
/** 수축기 혈압 */
systolic?: number;
/** 이완기 혈압 */
diastolic?: number;
/** 스트레스 지수 */
stress?: number;
/** HRV 지표들 */
hrv?: {
RMSSD?: number;
SDNN?: number;
};
/** 원시 RGB 데이터 */
rawData?: RgbDataObject;
/** 측정 품질 정보 */
quality?: {
positionError: number;
yPositionError: number;
dataPoints: number;
};
}
/**
* SDK 이벤트 콜백 타입들
*/
export interface SDKEventCallbacks {
/** 상태 변경 시 호출 */
onStateChange?: StateChangeCallback;
/** 측정 완료 시 호출 */
onMeasurementComplete?: (result: MeasurementResult) => void;
/** 오류 발생 시 호출 */
onError?: (error: FaceDetectionError) => void;
/** 진행률 업데이트 시 호출 */
onProgress?: (progress: number, dataLength: number) => void;
/** 얼굴 감지 상태 변경 시 호출 */
onFaceDetectionChange?: (detected: boolean, boundingBox: CalculatedBoundingBox | null) => void;
/** 얼굴이 원 안에 있는지 여부 변경 시 호출 */
onFacePositionChange?: (isInCircle: boolean) => void;
/** 카운트다운 업데이트 시 호출 */
onCountdown?: (remainingSeconds: number, totalSeconds: number) => void;
}