如何在Javacv中获得面相等范围
我使用的是Javacv 1.1。我们使用了一张约翰·列侬的照片来测试一个人脸识别系统,该系统包含一个数据库,其中有3张克里斯蒂亚诺·罗纳尔多和3张约翰·特里的照片。为了验证我的程序在数据库中找不到约翰·列侬,我使用了他的一张照片 但当节目预测谁是照片中的那个人时,我发现克里斯蒂亚诺·罗纳尔多是最相似的人 我需要输入图像和最相似的训练图像之间的距离,以检查是否足够相似来告诉我是谁,或者如果不够,告诉里面的人不知道 另一个问题: 有没有改进正确匹配的技巧?这是我的解决方案(仅针对Android平台进行测试),假设您使用eigenfaces:如何在Javacv中获得面相等范围,java,opencv,javacv,Java,Opencv,Javacv,我使用的是Javacv 1.1。我们使用了一张约翰·列侬的照片来测试一个人脸识别系统,该系统包含一个数据库,其中有3张克里斯蒂亚诺·罗纳尔多和3张约翰·特里的照片。为了验证我的程序在数据库中找不到约翰·列侬,我使用了他的一张照片 但当节目预测谁是照片中的那个人时,我发现克里斯蒂亚诺·罗纳尔多是最相似的人 我需要输入图像和最相似的训练图像之间的距离,以检查是否足够相似来告诉我是谁,或者如果不够,告诉里面的人不知道 另一个问题: 有没有改进正确匹配的技巧?这是我的解决方案(仅针对Android平台进
public boolean verifyPerson (Mat matResized) {
CvArr eigenvectors = faceRecognizer.getMat("eigenvectors");
CvArr averageFaceRow = faceRecognizer.getMat("mean");
IplImage img1D =MatToIplImage(matResized.reshape(1,1),-1, -1);
// Project the input image onto the eigenspace:
CvMat projection = subspaceProject(eigenvectors, averageFaceRow, img1D);
// Generate the reconstructed face back from the eigenspace:
CvMat reconstructionRow = subspaceReconstruct(eigenvectors, averageFaceRow, projection);
CvMat reconstructionMat = new CvMat();
cvReshape(reconstructionRow, reconstructionMat, 1, matResized.height());
Mat reconstructedFace = CvMatToMat(reconstructionMat);
// Calculate the L2 relative error between the 2 images.
double errorL2 = Core.norm(matResized, reconstructedFace, CV_L2);
// Scale the value since L2 is summed across all pixels.
double uncertainty = errorL2 / (double)(matResized.rows() * matResized.cols());
boolean verified;
if (uncertainty < MaxPersonUncertainty) {
verified = true;
}else{
verified = false; // Unknown person.
}
return verified;
}
public boolean verifyPerson(Mat matResized){
CvArr特征向量=faceRecognizer.getMat(“特征向量”);
CvArr averageFaceRow=人脸识别器.getMat(“平均值”);
IplImage img1D=MatToIplImage(matResized.重塑(1,1),-1,-1);
//将输入图像投影到特征空间:
CvMat投影=子空间投影(特征向量,平均面行,img1D);
//从特征空间生成重构面:
CvMat重建行=子宏结构(特征向量、平均面行、投影);
CvMat重建MAT=新CvMat();
CVReformate(重构行,重构垫,1,matResized.height());
Mat重建面=CvMatToMat(重建Mat);
//计算两幅图像之间的L2相对误差。
双重错误L2=核心规范(已调整尺寸、重建面、CV_L2);
//缩放值,因为L2在所有像素上求和。
double不确定性=errorL2/(double)(matResized.rows()*matResized.cols());
布尔验证;
if(不确定度<最大个人不确定度){
验证=真实;
}否则{
verified=false;//未知的人。
}
返回验证;
}
这是我的解决方案(仅针对Android平台进行测试),假设您使用eigenfaces:
public boolean verifyPerson (Mat matResized) {
CvArr eigenvectors = faceRecognizer.getMat("eigenvectors");
CvArr averageFaceRow = faceRecognizer.getMat("mean");
IplImage img1D =MatToIplImage(matResized.reshape(1,1),-1, -1);
// Project the input image onto the eigenspace:
CvMat projection = subspaceProject(eigenvectors, averageFaceRow, img1D);
// Generate the reconstructed face back from the eigenspace:
CvMat reconstructionRow = subspaceReconstruct(eigenvectors, averageFaceRow, projection);
CvMat reconstructionMat = new CvMat();
cvReshape(reconstructionRow, reconstructionMat, 1, matResized.height());
Mat reconstructedFace = CvMatToMat(reconstructionMat);
// Calculate the L2 relative error between the 2 images.
double errorL2 = Core.norm(matResized, reconstructedFace, CV_L2);
// Scale the value since L2 is summed across all pixels.
double uncertainty = errorL2 / (double)(matResized.rows() * matResized.cols());
boolean verified;
if (uncertainty < MaxPersonUncertainty) {
verified = true;
}else{
verified = false; // Unknown person.
}
return verified;
}
public boolean verifyPerson(Mat matResized){
CvArr特征向量=faceRecognizer.getMat(“特征向量”);
CvArr averageFaceRow=人脸识别器.getMat(“平均值”);
IplImage img1D=MatToIplImage(matResized.重塑(1,1),-1,-1);
//将输入图像投影到特征空间:
CvMat投影=子空间投影(特征向量,平均面行,img1D);
//从特征空间生成重构面:
CvMat重建行=子宏结构(特征向量、平均面行、投影);
CvMat重建MAT=新CvMat();
CVReformate(重构行,重构垫,1,matResized.height());
Mat重建面=CvMatToMat(重建Mat);
//计算两幅图像之间的L2相对误差。
双重错误L2=核心规范(已调整尺寸、重建面、CV_L2);
//缩放值,因为L2在所有像素上求和。
double不确定性=errorL2/(double)(matResized.rows()*matResized.cols());
布尔验证;
if(不确定度<最大个人不确定度){
验证=真实;
}否则{
verified=false;//未知的人。
}
返回验证;
}