diff --git a/CMakeLists.txt b/CMakeLists.txt index 1acdf8d1..2b03527c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,9 @@ string(CONCAT INSPIRE_FACE_VERSION_PATCH_STR ${INSPIRE_FACE_VERSION_PATCH}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cpp/inspireface/information.h.in ${CMAKE_CURRENT_SOURCE_DIR}/cpp/inspireface/information.h) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cpp/inspireface/version.txt.in ${CMAKE_CURRENT_SOURCE_DIR}/cpp/inspireface/version.txt) +# Creates a package config file +configure_file("${InspireFace_SOURCE_DIR}/cpp/inspireface/cmake/templates/InspireFaceConfig.cmake.in" "${CMAKE_BINARY_DIR}/install/InspireFaceConfig.cmake" @ONLY) + # Set the ISF_THIRD_PARTY_DIR variable to allow it to be set externally from the command line, or use the default path if it is not set set(ISF_THIRD_PARTY_DIR "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty" CACHE PATH "Path to the third-party libraries directory") diff --git a/cpp/inspireface/cmake/templates/InspireFaceConfig.cmake.in b/cpp/inspireface/cmake/templates/InspireFaceConfig.cmake.in new file mode 100644 index 00000000..b06aaa40 --- /dev/null +++ b/cpp/inspireface/cmake/templates/InspireFaceConfig.cmake.in @@ -0,0 +1,28 @@ +// clang-format off +# =================================================================================== +# The InspireFace CMake configuration file +# +# ** File generated automatically, do not modify ** +# Usage from an external project: +# In your CMakeLists.txt, add these lines: +# +# find_package(InspireFace REQUIRED) +# include_directories(${InspireFace_INCLUDE_DIRS}) # Not needed for CMake >= 2.8.11 +# target_link_libraries(MY_TARGET_NAME ${InspireFace_LIBS}) +# +# +# +# This file will define the following variables: +# - InspireFace_LIBS : The list of all imported targets for InspireFace modules. +# - InspireFace_INCLUDE_DIRS : The InspireFace include directories. +# +# +@PACKAGE_INIT@ + +set(InspireFace_LIBS "") +file(GLOB LIBS "@CMAKE_BINARY_DIR@/InspireFace/lib/*.*") + +list(APPEND InspireFace_LIBS ${LIBS}) +set(InspireFace_INCLUDE_DIRS "@CMAKE_BINARY_DIR@/InspireFace/include") + + // clang-format on \ No newline at end of file diff --git a/cpp/sample/CMakeLists.txt b/cpp/sample/CMakeLists.txt index 66d4d1c3..a4be69f6 100644 --- a/cpp/sample/CMakeLists.txt +++ b/cpp/sample/CMakeLists.txt @@ -39,13 +39,13 @@ set_target_properties(MTFaceTrackSample PROPERTIES ) if(NOT DISABLE_GUI) - # Examples of face detection and tracking - add_executable(FaceTrackVideoSample cpp/sample_face_track_video.cpp) - target_link_libraries(FaceTrackVideoSample InspireFace ${ext}) - set_target_properties(FaceTrackVideoSample PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/sample/" - ) -endif() + # Examples of face detection and tracking + add_executable(FaceTrackVideoSample cpp/sample_face_track_video.cpp) + target_link_libraries(FaceTrackVideoSample InspireFace ${ext}) + set_target_properties(FaceTrackVideoSample PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/sample/" + ) +endif () @@ -265,4 +265,5 @@ install(TARGETS MTFaceTrackSample RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/sa install(TARGETS FaceRecognitionSample RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/sample) install(TARGETS FaceSearchSample RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/sample) install(TARGETS FaceComparisonSample RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/sample) +install(TARGETS FaceTrackVideoSample RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/sample) diff --git a/cpp/sample/cpp/face_detect.cpp b/cpp/sample/cpp/face_detect.cpp index ee1f0a91..6013a229 100644 --- a/cpp/sample/cpp/face_detect.cpp +++ b/cpp/sample/cpp/face_detect.cpp @@ -31,10 +31,10 @@ int main() { auto img = cv::imread("/Users/tunm/Downloads/xtl.png"); double time; - time = (double) cv::getTickCount(); + time = (double)cv::getTickCount(); std::vector results = detect(img); - time = ((double) cv::getTickCount() - time) / cv::getTickFrequency(); - std::cout << "use time:" << time << "秒\n"; + time = ((double)cv::getTickCount() - time) / cv::getTickFrequency(); + std::cout << "use time:" << time << "s\n"; for (size_t i = 0; i < results.size(); i++) { auto &item = results[i]; diff --git a/cpp/sample/cpp/sample_face_track_video.cpp b/cpp/sample/cpp/sample_face_track_video.cpp index 84597757..ae3f4b7f 100644 --- a/cpp/sample/cpp/sample_face_track_video.cpp +++ b/cpp/sample/cpp/sample_face_track_video.cpp @@ -28,8 +28,8 @@ cv::Scalar generateColor(int id) { int maxID = 100; id = id % maxID; - int hue = (id * 360 / maxID) % 360; - int saturation = 255; + int hue = (id * 360 / maxID) % 360; + int saturation = 255; int value = 200; cv::Mat hsv(1, 1, CV_8UC3, cv::Scalar(hue, saturation, value)); @@ -40,7 +40,6 @@ cv::Scalar generateColor(int id) { return cv::Scalar(rgbColor[0], rgbColor[1], rgbColor[2]); } - int main(int argc, char* argv[]) { // Check whether the number of parameters is correct if (argc != 3) { @@ -107,11 +106,11 @@ int main(int argc, char* argv[]) { while (cap.read(frame)) { // Prepare an image parameter structure for configuration HFImageData imageParam = {0}; - imageParam.data = frame.data; // Data buffer - imageParam.width = frame.cols; // Target view width - imageParam.height = frame.rows; // Target view width - imageParam.rotation = HF_CAMERA_ROTATION_0; // Data source rotate - imageParam.format = HF_STREAM_BGR; // Data source format + imageParam.data = frame.data; // Data buffer + imageParam.width = frame.cols; // Target view width + imageParam.height = frame.rows; // Target view width + imageParam.rotation = HF_CAMERA_ROTATION_0; // Data source rotate + imageParam.format = HF_STREAM_BGR; // Data source format // Create an image data stream HFImageStream imageHandle = {0}; @@ -122,11 +121,11 @@ int main(int argc, char* argv[]) { } // Execute HF_FaceContextRunFaceTrack captures face information in an image - double time = (double) cv::getTickCount(); + double time = (double)cv::getTickCount(); HFMultipleFaceData multipleFaceData = {0}; ret = HFExecuteFaceTrack(session, imageHandle, &multipleFaceData); - time = ((double) cv::getTickCount() - time) / cv::getTickFrequency(); - std::cout << "use time:" << time << "秒\n"; + time = ((double)cv::getTickCount() - time) / cv::getTickFrequency(); + std::cout << "use time:" << time << "s\n"; if (ret != HSUCCEED) { std::cout << "Execute HFExecuteFaceTrack error: " << ret << std::endl; return ret; @@ -143,23 +142,20 @@ int main(int argc, char* argv[]) { drawMode(draw, detMode); if (faceNum > 0) { ret = HFMultipleFacePipelineProcessOptional(session, imageHandle, &multipleFaceData, option); - if (ret != HSUCCEED) - { + if (ret != HSUCCEED) { std::cout << "HFMultipleFacePipelineProcessOptional error: " << ret << std::endl; return ret; } HFFaceIntereactionState result; ret = HFGetFaceIntereactionStateResult(session, &result); - if (ret != HSUCCEED) - { + if (ret != HSUCCEED) { std::cout << "HFGetFaceIntereactionStateResult error: " << ret << std::endl; return ret; } std::cout << "Left eye status: " << result.leftEyeStatusConfidence[0] << std::endl; std::cout << "Righ eye status: " << result.rightEyeStatusConfidence[0] << std::endl; - } - + for (int index = 0; index < faceNum; ++index) { // std::cout << "========================================" << std::endl; // std::cout << "Process face index: " << index << std::endl; @@ -167,8 +163,8 @@ int main(int argc, char* argv[]) { auto trackId = multipleFaceData.trackIds[index]; // Use OpenCV's Rect to receive face bounding boxes - auto rect = cv::Rect(multipleFaceData.rects[index].x, multipleFaceData.rects[index].y, - multipleFaceData.rects[index].width, multipleFaceData.rects[index].height); + auto rect = cv::Rect(multipleFaceData.rects[index].x, multipleFaceData.rects[index].y, multipleFaceData.rects[index].width, + multipleFaceData.rects[index].height); cv::rectangle(draw, rect, generateColor(trackId), 3); // std::cout << "FaceID: " << trackId << std::endl; @@ -179,8 +175,8 @@ int main(int argc, char* argv[]) { // << ", Pitch: " << multipleFaceData.angles.pitch[index] << std::endl; // Add TrackID to the drawing - cv::putText(draw, "ID: " + std::to_string(trackId), cv::Point(rect.x, rect.y - 10), - cv::FONT_HERSHEY_SIMPLEX, 0.5, generateColor(trackId), 2); + cv::putText(draw, "ID: " + std::to_string(trackId), cv::Point(rect.x, rect.y - 10), cv::FONT_HERSHEY_SIMPLEX, 0.5, generateColor(trackId), + 2); HInt32 numOfLmk; HFGetNumOfFaceDenseLandmark(&numOfLmk); @@ -195,7 +191,7 @@ int main(int argc, char* argv[]) { cv::circle(draw, p, 0, generateColor(trackId), 2); } } - + cv::imshow("w", draw); cv::waitKey(1);