Loading Comparison/src/main/java/cz/fidentis/analyst/procrustes/ProcrustesAnalysis.java +26 −17 Original line number Diff line number Diff line Loading @@ -57,6 +57,15 @@ public class ProcrustesAnalysis { this.modelCentroid2 = ProcrustesAnalysisUtils.findCentroidOfFeaturePoints(model2.getFeaturePointValues()); } /** * Constructor with variable for scaling option. * Default scale option is set to false. * * @param humanFace1 * @param humanFace2 * @param scale * @throws ProcrustesAnalysisException */ public ProcrustesAnalysis( HumanFace humanFace1, HumanFace humanFace2, Loading Loading @@ -180,11 +189,6 @@ public class ProcrustesAnalysis { * @return ratioValue */ private double calculateScalingValue(List<FeaturePoint> featurePointList1, List<FeaturePoint> featurePointList2) { // double[] distancesOfList1 = ProcrustesAnalysisUtils.calculateMeanDistancesFromOrigin( // featurePointList1); // double[] distancesOfList2 = ProcrustesAnalysisUtils.calculateMeanDistancesFromOrigin( // featurePointList2); double[] distancesOfList1 = new double[featurePointList1.size()]; double[] distancesOfList2 = new double[featurePointList2.size()]; Loading @@ -193,17 +197,13 @@ public class ProcrustesAnalysis { Point3d featurePointCentroid2 = ProcrustesAnalysisUtils.findCentroidOfFeaturePoints( featurePointList2); Point3d centroid = ProcrustesAnalysisUtils.getMidPoint( featurePointCentroid1, featurePointCentroid2); // Point3d centroid = ProcrustesAnalysisUtils.getMidPoint( // featurePointCentroid1, featurePointCentroid2); for (int i = 0; i < featurePointList1.size(); i++) { distancesOfList1[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList1.get(i), centroid); distancesOfList2[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList2.get(i), centroid); distancesOfList1[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList1.get(i), featurePointCentroid1); distancesOfList2[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList2.get(i), featurePointCentroid2); } // distancesOfList1 = ProcrustesAnalysisUtils.calculateDistanceOfTwoPoints( // featurePointList1); // distancesOfList2 = ProcrustesAnalysisUtils.calculateDistanceOfTwoPoints( // featurePointList2); double[] ratioArray = new double[distancesOfList1.length]; double ratioValue = 0; Loading @@ -211,21 +211,30 @@ public class ProcrustesAnalysis { for (int i = 0; i < distancesOfList1.length; i++) { ratioArray[i] += distancesOfList1[i] / distancesOfList2[i]; } for (int i = 0; i < ratioArray.length; i++) { ratioValue += ratioArray[i]; } return ratioValue / distancesOfList1.length; } /** * Initiates scaling of feature points and vertices of given face model by scaleFactor. * * @param faceModel * @param scaleFactor */ private void scaleFace(ProcrustesAnalysisFaceModel faceModel, double scaleFactor) { calculateScaledList(faceModel.getVertices(), scaleFactor); calculateScaledList(faceModel.getFeaturePointValues(), scaleFactor); } /** * Scales each given point from list by multiplying its position coordinates with scaleFactor. * * @param list * @param scaleFactor * @param <T> either MeshPoint or FeaturePoint type. */ private <T extends IPosition> void calculateScaledList(List<T> list, double scaleFactor) { List<T> scaledList = new ArrayList<>(); for (T point : list) { Loading Comparison/src/main/java/cz/fidentis/analyst/procrustes/ProcrustesAnalysisComparison.java +1 −1 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ public class ProcrustesAnalysisComparison { FileResourcesUtils fru = new FileResourcesUtils(); HumanFaceFactory factory = new HumanFaceFactory(); FeaturePointImportService featurePointImportService = new FeaturePointImportService(); FeaturePointExportService featurePointExportService = new FeaturePointExportService(); // System.out.println("Working Directory = " + System.getProperty("user.dir")); Loading Loading @@ -80,7 +81,6 @@ public class ProcrustesAnalysisComparison { // FP_FILE_DIRECTORY.toString(), "3points_head02head01.fp"); // List<FeaturePoint> fpList02 = featurePointImportService.importFeaturePoints( // FP_FILE_DIRECTORY.toString(), "3points_ultramini_head02.fp"); // FeaturePointExportService featurePointExportService = new FeaturePointExportService(); // featurePointExportService.exportFeaturePoints(fpList01, "head01", "CSV"); // featurePointExportService.exportFeaturePoints(fpList02, "3points_ultramini_head02", "CSV"); Loading Comparison/src/main/java/cz/fidentis/analyst/procrustes/utils/ProcrustesAnalysisUtils.java +16 −2 Original line number Diff line number Diff line Loading @@ -2,11 +2,10 @@ package cz.fidentis.analyst.procrustes.utils; import cz.fidentis.analyst.feature.FeaturePoint; import cz.fidentis.analyst.feature.api.IPosition; import cz.fidentis.analyst.mesh.core.MeshPoint; import cz.fidentis.analyst.procrustes.ProcrustesAnalysisFaceModel; import org.ejml.simple.SimpleMatrix; import javax.vecmath.Point3d; import java.awt.*; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; Loading Loading @@ -144,6 +143,14 @@ public class ProcrustesAnalysisUtils { } /** * Scales position of given point by multiplying its coordinates with given scaleFactor. * * @param point * @param scaleFactor * @param <T> * @return */ public static <T extends IPosition> T scalePointDistance(T point, double scaleFactor) { point.getPosition().x = point.getX() * scaleFactor; point.getPosition().y = point.getY() * scaleFactor; Loading @@ -165,6 +172,13 @@ public class ProcrustesAnalysisUtils { + (Math.pow(fp1.getZ()- point.z, 2))); } /** * Gets point that is in middle between two given points. * * @param point1 * @param point2 * @return */ public static Point3d getMidPoint(Point3d point1, Point3d point2) { return new Point3d(((point1.x + point2.x) / 2), ((point1.y + point2.y) / 2), ((point1.z + point2.z) / 2)); } Loading GUI/src/main/java/cz/fidentis/analyst/registration/RegistrationAction.java +11 −0 Original line number Diff line number Diff line Loading @@ -259,6 +259,7 @@ public class RegistrationAction extends ControlPanelAction { break; case RegistrationPanel.ACTION_COMMAND_PROCRUSTES_SCALING: this.procrustesScalingEnabled = !this.procrustesScalingEnabled; Logger.print("Procrustes: scaling enabled is " + this.procrustesScalingEnabled); break; default: // to nothing Loading @@ -267,6 +268,16 @@ public class RegistrationAction extends ControlPanelAction { renderScene(); } /** * Calculates Procrustes analysis. * * First it creates object of type ProcrusteAnalasys containing two face models converted * to ProcrustesAnalysisFaceModel objects which are required for next analysis step. * * In analysis step faces are superimposed and rotated. * * If {@see this.procrustesScalingEnabled} is set to true then one of them is scaled as well. */ protected void initiateProcrustesAnalysis() { Logger.print("Procrustes Analysis"); Logger out = Logger.measureTime(); Loading Loading
Comparison/src/main/java/cz/fidentis/analyst/procrustes/ProcrustesAnalysis.java +26 −17 Original line number Diff line number Diff line Loading @@ -57,6 +57,15 @@ public class ProcrustesAnalysis { this.modelCentroid2 = ProcrustesAnalysisUtils.findCentroidOfFeaturePoints(model2.getFeaturePointValues()); } /** * Constructor with variable for scaling option. * Default scale option is set to false. * * @param humanFace1 * @param humanFace2 * @param scale * @throws ProcrustesAnalysisException */ public ProcrustesAnalysis( HumanFace humanFace1, HumanFace humanFace2, Loading Loading @@ -180,11 +189,6 @@ public class ProcrustesAnalysis { * @return ratioValue */ private double calculateScalingValue(List<FeaturePoint> featurePointList1, List<FeaturePoint> featurePointList2) { // double[] distancesOfList1 = ProcrustesAnalysisUtils.calculateMeanDistancesFromOrigin( // featurePointList1); // double[] distancesOfList2 = ProcrustesAnalysisUtils.calculateMeanDistancesFromOrigin( // featurePointList2); double[] distancesOfList1 = new double[featurePointList1.size()]; double[] distancesOfList2 = new double[featurePointList2.size()]; Loading @@ -193,17 +197,13 @@ public class ProcrustesAnalysis { Point3d featurePointCentroid2 = ProcrustesAnalysisUtils.findCentroidOfFeaturePoints( featurePointList2); Point3d centroid = ProcrustesAnalysisUtils.getMidPoint( featurePointCentroid1, featurePointCentroid2); // Point3d centroid = ProcrustesAnalysisUtils.getMidPoint( // featurePointCentroid1, featurePointCentroid2); for (int i = 0; i < featurePointList1.size(); i++) { distancesOfList1[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList1.get(i), centroid); distancesOfList2[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList2.get(i), centroid); distancesOfList1[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList1.get(i), featurePointCentroid1); distancesOfList2[i] = ProcrustesAnalysisUtils.calculateDistanceFromPoint(featurePointList2.get(i), featurePointCentroid2); } // distancesOfList1 = ProcrustesAnalysisUtils.calculateDistanceOfTwoPoints( // featurePointList1); // distancesOfList2 = ProcrustesAnalysisUtils.calculateDistanceOfTwoPoints( // featurePointList2); double[] ratioArray = new double[distancesOfList1.length]; double ratioValue = 0; Loading @@ -211,21 +211,30 @@ public class ProcrustesAnalysis { for (int i = 0; i < distancesOfList1.length; i++) { ratioArray[i] += distancesOfList1[i] / distancesOfList2[i]; } for (int i = 0; i < ratioArray.length; i++) { ratioValue += ratioArray[i]; } return ratioValue / distancesOfList1.length; } /** * Initiates scaling of feature points and vertices of given face model by scaleFactor. * * @param faceModel * @param scaleFactor */ private void scaleFace(ProcrustesAnalysisFaceModel faceModel, double scaleFactor) { calculateScaledList(faceModel.getVertices(), scaleFactor); calculateScaledList(faceModel.getFeaturePointValues(), scaleFactor); } /** * Scales each given point from list by multiplying its position coordinates with scaleFactor. * * @param list * @param scaleFactor * @param <T> either MeshPoint or FeaturePoint type. */ private <T extends IPosition> void calculateScaledList(List<T> list, double scaleFactor) { List<T> scaledList = new ArrayList<>(); for (T point : list) { Loading
Comparison/src/main/java/cz/fidentis/analyst/procrustes/ProcrustesAnalysisComparison.java +1 −1 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ public class ProcrustesAnalysisComparison { FileResourcesUtils fru = new FileResourcesUtils(); HumanFaceFactory factory = new HumanFaceFactory(); FeaturePointImportService featurePointImportService = new FeaturePointImportService(); FeaturePointExportService featurePointExportService = new FeaturePointExportService(); // System.out.println("Working Directory = " + System.getProperty("user.dir")); Loading Loading @@ -80,7 +81,6 @@ public class ProcrustesAnalysisComparison { // FP_FILE_DIRECTORY.toString(), "3points_head02head01.fp"); // List<FeaturePoint> fpList02 = featurePointImportService.importFeaturePoints( // FP_FILE_DIRECTORY.toString(), "3points_ultramini_head02.fp"); // FeaturePointExportService featurePointExportService = new FeaturePointExportService(); // featurePointExportService.exportFeaturePoints(fpList01, "head01", "CSV"); // featurePointExportService.exportFeaturePoints(fpList02, "3points_ultramini_head02", "CSV"); Loading
Comparison/src/main/java/cz/fidentis/analyst/procrustes/utils/ProcrustesAnalysisUtils.java +16 −2 Original line number Diff line number Diff line Loading @@ -2,11 +2,10 @@ package cz.fidentis.analyst.procrustes.utils; import cz.fidentis.analyst.feature.FeaturePoint; import cz.fidentis.analyst.feature.api.IPosition; import cz.fidentis.analyst.mesh.core.MeshPoint; import cz.fidentis.analyst.procrustes.ProcrustesAnalysisFaceModel; import org.ejml.simple.SimpleMatrix; import javax.vecmath.Point3d; import java.awt.*; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; Loading Loading @@ -144,6 +143,14 @@ public class ProcrustesAnalysisUtils { } /** * Scales position of given point by multiplying its coordinates with given scaleFactor. * * @param point * @param scaleFactor * @param <T> * @return */ public static <T extends IPosition> T scalePointDistance(T point, double scaleFactor) { point.getPosition().x = point.getX() * scaleFactor; point.getPosition().y = point.getY() * scaleFactor; Loading @@ -165,6 +172,13 @@ public class ProcrustesAnalysisUtils { + (Math.pow(fp1.getZ()- point.z, 2))); } /** * Gets point that is in middle between two given points. * * @param point1 * @param point2 * @return */ public static Point3d getMidPoint(Point3d point1, Point3d point2) { return new Point3d(((point1.x + point2.x) / 2), ((point1.y + point2.y) / 2), ((point1.z + point2.z) / 2)); } Loading
GUI/src/main/java/cz/fidentis/analyst/registration/RegistrationAction.java +11 −0 Original line number Diff line number Diff line Loading @@ -259,6 +259,7 @@ public class RegistrationAction extends ControlPanelAction { break; case RegistrationPanel.ACTION_COMMAND_PROCRUSTES_SCALING: this.procrustesScalingEnabled = !this.procrustesScalingEnabled; Logger.print("Procrustes: scaling enabled is " + this.procrustesScalingEnabled); break; default: // to nothing Loading @@ -267,6 +268,16 @@ public class RegistrationAction extends ControlPanelAction { renderScene(); } /** * Calculates Procrustes analysis. * * First it creates object of type ProcrusteAnalasys containing two face models converted * to ProcrustesAnalysisFaceModel objects which are required for next analysis step. * * In analysis step faces are superimposed and rotated. * * If {@see this.procrustesScalingEnabled} is set to true then one of them is scaled as well. */ protected void initiateProcrustesAnalysis() { Logger.print("Procrustes Analysis"); Logger out = Logger.measureTime(); Loading