Description
#250 根据这个人遇到同样的问题,我在代码中克隆了特征值,依然没有解决问题。
检测模型:face_detection_yunet_2023mar
识别模型:face_recognition_sface_2021dec
库版本:4.10.0
对比代码
-
(BOOL)isSamePersonWithImage1:(UIImage *)image1 image2:(UIImage *)image2 :(UIImageView *)iv1 :(UIImageView *)iv2{
// 将 UIImage 转换为 cv::Mat
cv::Mat cvImage1, cvImage2;
UIImageToMat(image1, cvImage1);
UIImageToMat(image2, cvImage2);// 将 4 通道的 RGBA 图像转换为 3 通道的 RGB 图像
cv::Mat rgbImage1;
cvtColor(cvImage1, rgbImage1, cv::COLOR_RGBA2RGB);
if (rgbImage1.empty()) {
NSLog(@"rgbImage1 is empty!");
}
// 将 4 通道的 RGBA 图像转换为 3 通道的 RGB 图像
cv::Mat rgbImage2;
cvtColor(cvImage2, rgbImage2, cv::COLOR_RGBA2RGB);
if (rgbImage2.empty()) {
NSLog(@"rgbImage2 is empty!");
}// 检测第一张图片中的人脸
cv::Mat faces1;
_faceDetector->setInputSize(cv::Size(image1.size.width,image1.size.height));
_faceDetector->detect(rgbImage1, faces1);
if (faces1.rows < 1) {
return NO; // 未检测到人脸
}// 检测第二张图片中的人脸
cv::Mat faces2;
_faceDetector->setInputSize(cv::Size(image2.size.width,image2.size.height));
_faceDetector->detect(rgbImage2, faces2);
if (faces2.rows < 1) {
return NO; // 未检测到人脸
}// 对齐和裁剪人脸
cv::Mat alignedFace1, alignedFace2;
_faceRecognizer->alignCrop(rgbImage1, faces1.row(0), alignedFace1);
_faceRecognizer->alignCrop(rgbImage2, faces2.row(0), alignedFace2);
std::cout << "Rect1: " << faces1.row(0) << std::endl;
std::cout << "Rect2: " << faces2.row(0) << std::endl;
MAIN(^{
iv1.image=MatToUIImage(alignedFace1);
iv2.image=MatToUIImage(alignedFace2);
});
// 提取特征
cv::Mat feature1;
cv::Mat feature2;
_faceRecognizer->feature(alignedFace1, feature1);
_faceRecognizer->feature(alignedFace2, feature2);
cv::Mat feature11=feature1.clone();
cv::Mat feature22=feature2.clone();// 比较两个 Mat 是否完全一致
cv::Mat result = (feature11 == feature22);
int nonZeroCount = cv::countNonZero(result);if (nonZeroCount == feature11.total()) {
std::cout << "两个 Mat 完全一致" << std::endl;
} else {
std::cout << "两个 Mat 不完全一致" << std::endl;
}
// std::cout << "Feature1: " << feature1<< std::endl;
// std::cout << "Feature2: " << feature2<< std::endl;
// 计算相似度
double cosScore = _faceRecognizer->match(feature11,feature22, cv::FaceRecognizerSF::FR_COSINE);
double l2Score = _faceRecognizer->match(feature11, feature22, cv::FaceRecognizerSF::FR_NORM_L2);
// 判断是否为同一个人
//严格判断是同一个人cosineSimilarThresh=0.4 l2NormSimilarThresh=1 //两张脸非常相似
//宽松判断是同一个人cosineSimilarThresh=0.3 l2NormSimilarThresh=1.2 //两张脸不太相似也可能判断是一个人
double cosineSimilarThresh = 0.4; // 相似度阈值 值范围0~1越高越严格
double l2NormSimilarThresh = 1.0; // 距离阈值 值范围0~正无穷 越低越严格
NSLog(@"余弦距离:%.2f 欧几里得距离:%.2f",cosScore,l2Score);
return (cosScore >= cosineSimilarThresh) && (l2Score <= l2NormSimilarThresh);
}

Activity