| 6 | #include <inspireface/inspireface.hpp> |
| 7 | |
| 8 | int main(int argc, char** argv) { |
| 9 | if (argc != 3) { |
| 10 | std::cout << "Usage: " << argv[0] << " <model_path> <image_path>" << std::endl; |
| 11 | return -1; |
| 12 | } |
| 13 | |
| 14 | std::string model_path = argv[1]; |
| 15 | std::string image_path = argv[2]; |
| 16 | |
| 17 | // Global init(only once) |
| 18 | INSPIREFACE_CONTEXT->Reload(model_path); |
| 19 | |
| 20 | // Create image and frame process |
| 21 | inspirecv::Image image = inspirecv::Image::Create(image_path); |
| 22 | inspirecv::FrameProcess process = |
| 23 | inspirecv::FrameProcess::Create(image.Data(), image.Height(), image.Width(), inspirecv::BGR, inspirecv::ROTATION_90); |
| 24 | |
| 25 | // Create session |
| 26 | inspire::CustomPipelineParameter param; |
| 27 | param.enable_recognition = true; |
| 28 | param.enable_liveness = true; |
| 29 | param.enable_mask_detect = true; |
| 30 | param.enable_face_attribute = true; |
| 31 | param.enable_face_quality = true; |
| 32 | std::shared_ptr<inspire::Session> session(inspire::Session::CreatePtr(inspire::DETECT_MODE_ALWAYS_DETECT, 100, param, 640)); |
| 33 | session->SetTrackPreviewSize(640); |
| 34 | |
| 35 | INSPIREFACE_CHECK_MSG(session != nullptr, "Session is not valid"); |
| 36 | |
| 37 | // Detect and track |
| 38 | std::vector<inspire::FaceTrackWrap> results; |
| 39 | int32_t ret; |
| 40 | ret = session->FaceDetectAndTrack(process, results); |
| 41 | INSPIREFACE_CHECK_MSG(ret == 0, "FaceDetectAndTrack failed"); |
| 42 | |
| 43 | // Run pipeline for each face |
| 44 | ret = session->MultipleFacePipelineProcess(process, param, results); |
| 45 | INSPIREFACE_CHECK_MSG(ret == 0, "MultipleFacePipelineProcess failed"); |
| 46 | |
| 47 | for (auto& result : results) { |
| 48 | std::cout << "result: " << result.trackId << std::endl; |
| 49 | std::cout << "quality: " << result.quality[0] << ", " << result.quality[1] << ", " << result.quality[2] << ", " << result.quality[3] << ", " |
| 50 | << result.quality[4] << std::endl; |
| 51 | inspirecv::Rect2i rect = inspirecv::Rect2i::Create(result.rect.x, result.rect.y, result.rect.width, result.rect.height); |
| 52 | std::cout << rect << std::endl; |
| 53 | image.DrawRect(rect, inspirecv::Color::Red); |
| 54 | inspirecv::TransformMatrix trans = inspirecv::TransformMatrix::Create(result.trans.m00, result.trans.m01, result.trans.tx, result.trans.m10, result.trans.m11, result.trans.ty); |
| 55 | std::cout << "trans: " << trans.GetInverse() << std::endl; |
| 56 | |
| 57 | std::vector<inspirecv::Point2f> landmark = session->GetFaceDenseLandmark(result); |
| 58 | for (auto& point : landmark) { |
| 59 | image.DrawCircle(point.As<int>(), 2, inspirecv::Color::Green); |
| 60 | } |
| 61 | } |
| 62 | image.Write("result.jpg"); |
| 63 | |
| 64 | return 0; |
| 65 | } |
nothing calls this directly
no test coverage detected