/** 计算一张图片的均差,仅针对一个人的图像做计算 形参icon为1副人脸图像(ImageIcon类型) */ public static double[] calAveDeviationOneObject(ImageIcon icon) { icon = ImageHandle(icon, width, height); // 图片等比例处理 Image img = icon.getImage(); BufferedImage bimg = ImageUtil.ImageToBufferedImage(img); // 获取第i张图片的像素,并转成double[] int[] imgVec = getPixes(bimg); // 获取像素 double[] imgVecD = intToDouble(imgVec); // 将int[]转成double[] double[] result = calAveDeviationOneObject(imgVecD); return result; }
/** * 取图片特征值和特征向量方法 结果:[特征值]和[特征向量]保存在Features的[EigenValue]和[featureVector]内 * * @param args 传入N张图片 * @return 返回空 */ public static void imageToResult(ImageIcon[] icon) { int pixLength = width * height; // 图片一维数组长度 // Image[] img = new Image[icon.length]; // BufferedImage[] bimg = new BufferedImage[icon.length]; double[][] vec = new double[pixLength][icon.length]; // System.out.println(icon.length + "!@#:" + pixLength); for (int i = 0; i < icon.length; i++) { icon[i] = ImageHandle(icon[i], width, height); // 图片等比例处理 Image img = icon[i].getImage(); BufferedImage bimg = ImageUtil.ImageToBufferedImage(img); // 获取第i张图片的像素,并转成double[] int[] imgVec = getPixes(bimg); // 获取像素 // for(int z =0; z<imgVec.length; z++) // System.out.print(imgVec[z]); // System.out.println("_____________________________________"); double[] imgVecD = intToDouble(imgVec); // 将int[]转成double[] // 构造vec[][],即N副人脸图像(一维)合成的二维数据 for (int j = 0; j < imgVecD.length; j++) { vec[j][i] = imgVecD[j]; } } // 计算平均人脸图像 double[] aveVec = calAveVector(vec); // 计算每张图片的均差 double[][] aveDev = calAveDeviation(vec, aveVec); // 计算协方差矩阵 double[][] covMat = calCovarianceMatrix(aveDev); // 通过SVD定理,计算矩阵的特征值 double[] eigenValue = calEigenValue(covMat); // Features.getInstance().setEigenValue(eigenValue); // 通过SVD定理,计算矩阵的特征向量 double[][] featureVector = calFeatureVector(covMat); // Features.getInstance().setFeatureVector(featureVector); // 通过公式变换,求取真正的特征向量 changeFeatureVector(); }