/** * Created by Jingyu Yan * @date 2024-10-01 */ #include #include int main(int argc, char* argv[]) { // Check whether the number of parameters is correct if (argc < 3 || argc > 4) { HFLogPrint(HF_LOG_ERROR, "Usage: %s [rotation]", argv[0]); return 1; } auto packPath = argv[1]; auto sourcePath = argv[2]; int rotation = 0; // If rotation is provided, check and set the value if (argc == 4) { rotation = std::atoi(argv[3]); if (rotation != 0 && rotation != 90 && rotation != 180 && rotation != 270) { HFLogPrint(HF_LOG_ERROR, "Invalid rotation value. Allowed values are 0, 90, 180, 270."); return 1; } } HFRotation rotation_enum; // Set rotation based on input parameter switch (rotation) { case 90: rotation_enum = HF_CAMERA_ROTATION_90; break; case 180: rotation_enum = HF_CAMERA_ROTATION_180; break; case 270: rotation_enum = HF_CAMERA_ROTATION_270; break; case 0: default: rotation_enum = HF_CAMERA_ROTATION_0; break; } HFLogPrint(HF_LOG_INFO, "Pack file Path: %s", packPath); HFLogPrint(HF_LOG_INFO, "Source file Path: %s", sourcePath); HFLogPrint(HF_LOG_INFO, "Rotation: %d", rotation); HFSetLogLevel(HF_LOG_INFO); HResult ret; // The resource file must be loaded before it can be used ret = HFLaunchInspireFace(packPath); if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Load Resource error: %d", ret); return ret; } // Enable the functions in the pipeline: mask detection, live detection, and face quality // detection HOption option = HF_ENABLE_QUALITY | HF_ENABLE_MASK_DETECT | HF_ENABLE_LIVENESS | HF_ENABLE_DETECT_MODE_LANDMARK; // Non-video or frame sequence mode uses IMAGE-MODE, which is always face detection without // tracking HFDetectMode detMode = HF_DETECT_MODE_ALWAYS_DETECT; // Maximum number of faces detected HInt32 maxDetectNum = 20; // Face detection image input level HInt32 detectPixelLevel = 160; // Handle of the current face SDK algorithm context HFSession session = {0}; ret = HFCreateInspireFaceSessionOptional(option, detMode, maxDetectNum, detectPixelLevel, -1, &session); if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Create FaceContext error: %d", ret); return ret; } HFSessionSetTrackPreviewSize(session, detectPixelLevel); HFSessionSetFilterMinimumFacePixelSize(session, 4); // Load a image HFImageBitmap image; ret = HFCreateImageBitmapFromFilePath(sourcePath, 3, &image); if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "The source entered is not a picture or read error."); return ret; } // Prepare an image parameter structure for configuration HFImageStream imageHandle = {0}; ret = HFCreateImageStreamFromImageBitmap(image, rotation_enum, &imageHandle); if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Create ImageStream error: %d", ret); return ret; } int loop = 100; // Enable the cost spend HFSessionSetEnableTrackCostSpend(session, 1); // Execute HF_FaceContextRunFaceTrack captures face information in an image HFMultipleFaceData multipleFaceData = {0}; for (int i = 0; i < loop; i++) { ret = HFExecuteFaceTrack(session, imageHandle, &multipleFaceData); if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Execute HFExecuteFaceTrack error: %d", ret); return ret; } } HFLogPrint(HF_LOG_INFO, "Number of Detection: %d", multipleFaceData.detectedNum); HFSessionPrintTrackCostSpend(session); ret = HFReleaseImageStream(imageHandle); if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Release image stream error: %d", ret); } // The memory must be freed at the end of the program ret = HFReleaseInspireFaceSession(session); if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Release session error: %d", ret); return ret; } ret = HFReleaseImageBitmap(image); if (ret != HSUCCEED) { HFLogPrint(HF_LOG_ERROR, "Release image bitmap error: %d", ret); return ret; } return 0; }