// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 LIBFACECAPTURE_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // LIBFACECAPTURE_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifndef LIBFACECAPTURE #define LIBFACECAPTURE #include #include #ifdef _WIN32 #ifdef LIBFACECAPTURE_EXPORTS #define LIBFACECAPTURE_API __declspec(dllexport) #else #define LIBFACECAPTURE_API __declspec(dllimport) #endif # elif ( defined(__GNUC__) && __GNUC__ >= 4 ) #define LIBFACECAPTURE_API __attribute__((visibility("default"))) #else // _WIN32 #define LIBFACECAPTURE_API #endif // _WIN32 #ifndef MAX_PATH #define MAX_PATH 260 #endif #ifndef INFINITE #define INFINITE 0xFFFFFFFF // Infinite timeout #endif // !INFINITE //配置参数 struct CFaceCaptureConfig { int nPrimCamera; //双摄像头模式下,0:以环境相机为首选相机(单相机默认为0),1:以操作相机为首选相机 int nServersType; //0:前端,1:后台 int nContourMinAera; //运动跟踪最小面积 int nUpCameraEdgeLimit; // int nDownCameraEdgeLimit; // char strFaceDataDirPath[MAX_PATH]; // 配置文件路径 float fOperateFaceSize; //可操作距离时人脸系数,0.5M float fCloseFaceSize; //靠近距离时人脸系数,1.5M float fFarFaceSize; //远距离时人脸系数,2.5M float fSearchFaceSize; //远距离时搜索人脸的系数 float fDetectFaceSize; //人脸检测时搜索人脸的系数 int nFaceSizeOffset; //不同人脸的偏移标准 int nSleepLong; //检测时间间隔长 int nSleepMiddle; //检测时间间隔中 int nSleepShort; //检测时间间隔短 int nThresholdNum; //二值化参数 }; struct CCustomerRange { short sX; //人脸中心点X坐标 short sY; //人脸中心点Y坐标 short sH; //人脸中心点到剪辑矩形上边沿的高度,即矩形高度=sH*2,矩形按4:3的比例,宽度=SH*2*4/3 }; enum SceneEnum { UncertainScene = 0, LockScene, //锁定 UnLockScene, //失去锁定 RockScene, //晃动 ForwardScened, //向前 BackwardScened //向后 }; enum DistanceEnum { UncertainDistance = 0, OperateDistance, //操作距离 CloseDistance, //近端 FarDistance //远端 }; enum PoseEnum { UncertainPose = 0, StandPose, //站立 SitPose //坐立 }; enum CameraEnum { EnvironCamera = 0, //环境相机 OperatorCamera, //操作相机 ErrorCamera }; struct CCustomerPosition { CameraEnum eCamera; //1、2号摄像头 SceneEnum eScene; //0不确定,1开始锁定、2失去锁定、3晃动、4向前、5向后 DistanceEnum eDistance; //0不确定,1操作距离,2近端,3远端 PoseEnum ePose; //0不确定,1-站立,2-坐立 CCustomerRange stRange; }; //脸部覆盖物 struct CCover { bool bIsClearFace; //脸部是否可见 bool bShowEyes; //眼睛是否可见 bool bShowNose; //鼻子是否可见 bool bShowMouth; //嘴巴是否可见 }; //人脸亮度 enum BrightnessEnum { VeryLow = 0, //极低 < 40 Lower, //比较低 >40 <80 NorMal, //正常 >80 <160 Higher, //比较高 >160 <200 VeryHigh //极高 >200 }; //客户常规属性 struct CCustomerStatus { CCustomerPosition stCustomerPos; //客户位置属性 CCover stCustomerCover; //覆盖属性 BrightnessEnum eBrightness; //人脸亮度 }; enum SexEnum { UncertainSex = 0, //不知道 Women, //女 Man //男 }; enum YoungOldEnum { UncertainAge = 0, //不知道 Child, //小孩 Young, //年轻人 MiddleAged, //中年人 Old //老年人 }; enum HeightEnunm { UncertainHeight = 0, //不知道 Low, //矮 Middle, //中等 High //高 }; //客户交互属性 struct CCustomerAppearance { SexEnum eSex; // 0不知道,1女,2男 YoungOldEnum eYoungOld; // 0不知道,1小孩,2年轻人,3中年人,4老人 HeightEnunm eHeight; // 0不知道,1矮,2中等,3高 }; //监控模式 enum MonitorEnum { FaceDetect =0, //人脸检测 MotionTarckAndFaceDetect, //运动跟踪+人脸检测 MotionTarckAndFaceRecog, //运动跟踪+人脸识别 }; enum facecap_loglevel { FACECAP_DEBUG = 0, FACECAP_INFO = 1, FACECAP_WARN = 2, FACECAP_ERROR = 3, FACECAP_FATAL = 4 }; enum video_monitor_event_type { Close, //有人靠近 1.5M Leave, //客户离开,客户消失或退出到接近距离外1.5M EnterOperate, //客户进入操作距离 0.5M BackToClose, //客户退回到接近距离 Appear, //有人出现在视野中 CustomerChange, //客户已经换人 CaptureFace, //捕获脸部事件 LoseFace, //失去脸部事件 FaceCaptureFC, //人脸识别崩溃 NoDetectBody //未检测到人 }; class CVideoMonitorEvent { public: virtual void GenerateMonitorEvent(video_monitor_event_type eType, char* strMsg = NULL) = 0; }; struct CImageFrame { unsigned char *data; int width; int height; int framesize; }; class CHostApi { public: virtual uint64_t GenerateUUID() = 0; virtual void GetFaceImgName(char* FaceName, uint32_t uLen) = 0; virtual bool IsCustomerChange() = 0; virtual bool LoadConfig(CFaceCaptureConfig &config) = 0; virtual void Debug(facecap_loglevel elevel, const char *fmt, ...) = 0; }; class Clibfacecapture_impl; //桥接 // 此类是从 libfacecapture.dll 导出的 class LIBFACECAPTURE_API Clibfacecapture { public: //EnvironMinVideoName:环境摄像头共享视频队列的文件名 //OperateVideoName:操作摄像头共享视频队列的文件名 //OperateVideoName默认为Null时设备运行于单摄像头模式 //开始视频监控,pHost:事件,nMonitorFreq:监控频率,单位ms,MonitorType:监控类型,有三种模式可供选择 Clibfacecapture(bool *pResult, CHostApi *pHostAPI, CVideoMonitorEvent*pHost, const char* EnvironVideoName, const char* OperateVideoName = NULL, MonitorEnum eMonitorType = MotionTarckAndFaceDetect); ~Clibfacecapture(void); bool StartFaceCapture(); bool StopFaceCapture(); //有多少其他用户 bool GetCustomerNum(uint32_t &num); //获取所有用户FACEID bool GetTrackFace(uint64_t *arrFaceIDs, int *size); //获取主用户的常规属性 bool GetMainCustomerStatus(uint64_t& FaceID, CCustomerStatus &Property); //获取其他用户的常规属性 bool GetCustomerStatus(uint64_t FaceID, CCustomerStatus &Property); //获取主用户的交互属性 bool GetCustomerAppearance(uint64_t FaceID, CCustomerAppearance &Property); void SetLightChange();//灯光变化,此时算法要做处理防止误判 void SetCameraState(int nState); private: Clibfacecapture_impl*m_pImpl; }; bool LIBFACECAPTURE_API SnapShot(CImageFrame*img); #endif