mirror of
https://github.com/deepinsight/insightface.git
synced 2026-07-08 21:07:52 +00:00
Update InspireFace to 1.1.4
This commit is contained in:
@@ -7,16 +7,27 @@
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
// Check whether the number of parameters is correct
|
||||
if (argc != 3) {
|
||||
std::cerr << "Usage: " << argv[0] << " <pack_path> <source_path>\n";
|
||||
if (argc < 3 || argc > 4) {
|
||||
std::cerr << "Usage: " << argv[0] << " <pack_path> <source_path> [rotation]\n";
|
||||
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) {
|
||||
std::cerr << "Invalid rotation value. Allowed values are 0, 90, 180, 270.\n";
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
std::cout << "Pack file Path: " << packPath << std::endl;
|
||||
std::cout << "Source file Path: " << sourcePath << std::endl;
|
||||
std::cout << "Rotation: " << rotation << std::endl;
|
||||
|
||||
HResult ret;
|
||||
// The resource file must be loaded before it can be used
|
||||
@@ -55,9 +66,26 @@ int main(int argc, char* argv[]) {
|
||||
HFImageData imageParam = {0};
|
||||
imageParam.data = image.data; // Data buffer
|
||||
imageParam.width = image.cols; // Target view width
|
||||
imageParam.height = image.rows; // Target view width
|
||||
imageParam.rotation = HF_CAMERA_ROTATION_0; // Data source rotate
|
||||
imageParam.format = HF_STREAM_BGR; // Data source format
|
||||
imageParam.height = image.rows; // Target view width
|
||||
|
||||
// Set rotation based on input parameter
|
||||
switch (rotation) {
|
||||
case 90:
|
||||
imageParam.rotation = HF_CAMERA_ROTATION_90;
|
||||
break;
|
||||
case 180:
|
||||
imageParam.rotation = HF_CAMERA_ROTATION_180;
|
||||
break;
|
||||
case 270:
|
||||
imageParam.rotation = HF_CAMERA_ROTATION_270;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
imageParam.rotation = HF_CAMERA_ROTATION_0;
|
||||
break;
|
||||
}
|
||||
|
||||
imageParam.format = HF_STREAM_BGR; // Data source format
|
||||
|
||||
// Create an image data stream
|
||||
HFImageStream imageHandle = {0};
|
||||
@@ -82,10 +110,11 @@ int main(int argc, char* argv[]) {
|
||||
cv::Mat draw = image.clone();
|
||||
for (int index = 0; index < faceNum; ++index) {
|
||||
std::cout << "========================================" << std::endl;
|
||||
std::cout << "Token size: " << multipleFaceData.tokens[index].size << std::endl;
|
||||
std::cout << "Process face index: " << index << std::endl;
|
||||
// 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);
|
||||
multipleFaceData.rects[index].width, multipleFaceData.rects[index].height);
|
||||
cv::rectangle(draw, rect, cv::Scalar(0, 100, 255), 4);
|
||||
|
||||
// Print FaceID, In IMAGE-MODE it is changing, in VIDEO-MODE it is fixed, but it may be lost
|
||||
@@ -93,9 +122,21 @@ int main(int argc, char* argv[]) {
|
||||
|
||||
// Print Head euler angle, It can often be used to judge the quality of a face by the Angle of the head
|
||||
std::cout << "Roll: " << multipleFaceData.angles.roll[index]
|
||||
<< ", Yaw: " << multipleFaceData.angles.roll[index]
|
||||
<< ", Pitch: " << multipleFaceData.angles.pitch[index] << std::endl;
|
||||
<< ", Yaw: " << multipleFaceData.angles.roll[index]
|
||||
<< ", Pitch: " << multipleFaceData.angles.pitch[index] << std::endl;
|
||||
|
||||
HInt32 numOfLmk;
|
||||
HFGetNumOfFaceDenseLandmark(&numOfLmk);
|
||||
HPoint2f denseLandmarkPoints[numOfLmk];
|
||||
ret = HFGetFaceDenseLandmarkFromFaceToken(multipleFaceData.tokens[index], denseLandmarkPoints, numOfLmk);
|
||||
if (ret != HSUCCEED) {
|
||||
std::cerr << "HFGetFaceDenseLandmarkFromFaceToken error!!" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
for (size_t i = 0; i < numOfLmk; i++) {
|
||||
cv::Point2f p(denseLandmarkPoints[i].x, denseLandmarkPoints[i].y);
|
||||
cv::circle(draw, p, 0, (0, 0, 255), 2);
|
||||
}
|
||||
}
|
||||
cv::imwrite("draw_detected.jpg", draw);
|
||||
|
||||
@@ -117,7 +158,6 @@ int main(int argc, char* argv[]) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// Get face quality results from the pipeline cache
|
||||
HFFaceQualityConfidence qualityConfidence = {0};
|
||||
ret = HFGetFaceQualityConfidence(session, &qualityConfidence);
|
||||
@@ -152,6 +192,5 @@ int main(int argc, char* argv[]) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,13 +44,13 @@ int main(int argc, char* argv[]) {
|
||||
}
|
||||
|
||||
// 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;
|
||||
HOption option = HF_ENABLE_QUALITY | HF_ENABLE_MASK_DETECT | HF_ENABLE_INTERACTION;
|
||||
// Video or frame sequence mode uses VIDEO-MODE, which is face detection with tracking
|
||||
HFDetectMode detMode = HF_DETECT_MODE_TRACK_BY_DETECTION;
|
||||
HFDetectMode detMode = HF_DETECT_MODE_LIGHT_TRACK;
|
||||
// Maximum number of faces detected
|
||||
HInt32 maxDetectNum = 20;
|
||||
// Face detection image input level
|
||||
HInt32 detectPixelLevel = 320;
|
||||
HInt32 detectPixelLevel = 160;
|
||||
// fps in tracking-by-detection mode
|
||||
HInt32 trackByDetectFps = 20;
|
||||
HFSession session = {0};
|
||||
@@ -122,7 +122,25 @@ int main(int argc, char* argv[]) {
|
||||
|
||||
// Draw detection mode on the frame
|
||||
drawMode(draw, detMode);
|
||||
if (faceNum > 0) {
|
||||
ret = HFMultipleFacePipelineProcessOptional(session, imageHandle, &multipleFaceData, option);
|
||||
if (ret != HSUCCEED)
|
||||
{
|
||||
std::cout << "HFMultipleFacePipelineProcessOptional error: " << ret << std::endl;
|
||||
return ret;
|
||||
}
|
||||
HFFaceIntereactionResult result;
|
||||
ret = HFGetFaceIntereactionResult(session, &result);
|
||||
if (ret != HSUCCEED)
|
||||
{
|
||||
std::cout << "HFGetFaceIntereactionResult 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;
|
||||
@@ -143,8 +161,21 @@ int main(int argc, char* argv[]) {
|
||||
// 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, cv::Scalar(0, 255, 0), 2);
|
||||
}
|
||||
|
||||
HInt32 numOfLmk;
|
||||
HFGetNumOfFaceDenseLandmark(&numOfLmk);
|
||||
HPoint2f denseLandmarkPoints[numOfLmk];
|
||||
ret = HFGetFaceDenseLandmarkFromFaceToken(multipleFaceData.tokens[index], denseLandmarkPoints, numOfLmk);
|
||||
if (ret != HSUCCEED) {
|
||||
std::cerr << "HFGetFaceDenseLandmarkFromFaceToken error!!" << std::endl;
|
||||
return -1;
|
||||
}
|
||||
for (size_t i = 0; i < numOfLmk; i++) {
|
||||
cv::Point2f p(denseLandmarkPoints[i].x, denseLandmarkPoints[i].y);
|
||||
cv::circle(draw, p, 0, (0, 0, 255), 2);
|
||||
}
|
||||
}
|
||||
|
||||
cv::imshow("w", draw);
|
||||
cv::waitKey(1);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user