Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javacv中获得面相等范围_Java_Opencv_Javacv - Fatal编程技术网

如何在Javacv中获得面相等范围

如何在Javacv中获得面相等范围,java,opencv,javacv,Java,Opencv,Javacv,我使用的是Javacv 1.1。我们使用了一张约翰·列侬的照片来测试一个人脸识别系统,该系统包含一个数据库,其中有3张克里斯蒂亚诺·罗纳尔多和3张约翰·特里的照片。为了验证我的程序在数据库中找不到约翰·列侬,我使用了他的一张照片 但当节目预测谁是照片中的那个人时,我发现克里斯蒂亚诺·罗纳尔多是最相似的人 我需要输入图像和最相似的训练图像之间的距离,以检查是否足够相似来告诉我是谁,或者如果不够,告诉里面的人不知道 另一个问题: 有没有改进正确匹配的技巧?这是我的解决方案(仅针对Android平台进

我使用的是Javacv 1.1。我们使用了一张约翰·列侬的照片来测试一个人脸识别系统,该系统包含一个数据库,其中有3张克里斯蒂亚诺·罗纳尔多和3张约翰·特里的照片。为了验证我的程序在数据库中找不到约翰·列侬,我使用了他的一张照片

但当节目预测谁是照片中的那个人时,我发现克里斯蒂亚诺·罗纳尔多是最相似的人

我需要输入图像和最相似的训练图像之间的距离,以检查是否足够相似来告诉我是谁,或者如果不够,告诉里面的人不知道

另一个问题: 有没有改进正确匹配的技巧?

这是我的解决方案(仅针对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;//未知的人。
}
返回验证;
}
这是我的解决方案(仅针对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;//未知的人。
}
返回验证;
}