|
From: <bma...@us...> - 2017-04-25 16:31:27
|
Revision: 9547
http://sourceforge.net/p/fudaa/svn/9547
Author: bmarchan
Date: 2017-04-25 16:31:24 +0000 (Tue, 25 Apr 2017)
Log Message:
-----------
Mise au point de la mise a l'echelle des images.
Modified Paths:
--------------
trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivOrthoLaunchAction.java
trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/io/PivExeLauncher.java
Modified: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivOrthoLaunchAction.java
===================================================================
--- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivOrthoLaunchAction.java 2017-04-19 08:35:20 UTC (rev 9546)
+++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/action/PivOrthoLaunchAction.java 2017-04-25 16:31:24 UTC (rev 9547)
@@ -58,17 +58,28 @@
public void act() {
try {
- CtuluLog ana=new CtuluLog();
- ana.setDesc(getName());
- PivExeLauncher.instance().computeOrthoCoefs(ana, impl.getCurrentProject(), this);
- if (ana.containsErrorOrSevereError()) {
- impl.error(ana.getResume());
- return;
+ if (impl.getCurrentProject().isFullOrtho()) {
+ CtuluLog ana=new CtuluLog();
+ ana.setDesc(getName());
+ PivExeLauncher.instance().computeOrthoCoefs(ana, impl.getCurrentProject(), this);
+ if (ana.containsErrorOrSevereError()) {
+ impl.error(ana.getResume());
+ return;
+ }
+ PivExeLauncher.instance().computeTransfImg(ana, impl.getCurrentProject(), false, this);
+ if (ana.containsErrorOrSevereError()) {
+ impl.error(ana.getResume());
+ return;
+ }
}
- PivExeLauncher.instance().computeTransfImg(ana, impl.getCurrentProject(), false, this);
- if (ana.containsErrorOrSevereError()) {
- impl.error(ana.getResume());
- return;
+ else {
+ CtuluLog ana=new CtuluLog();
+ ana.setDesc(getName());
+ PivExeLauncher.instance().computeScalingImages(ana, impl.getCurrentProject(), false, this);
+ if (ana.containsErrorOrSevereError()) {
+ impl.error(ana.getResume());
+ return;
+ }
}
}
finally {
@@ -94,15 +105,18 @@
* @return true Si toutes les donn\xE9es sont pr\xE9sentes pour un lancement.
*/
public boolean isValide() {
- if (impl.getCurrentProject().getOrthoPoints()==null) {
- impl.error(PivResource.getS("Erreur"), PivResource.getS("Aucun point de r\xE9f\xE9rence au sol n'a \xE9t\xE9 d\xE9fini"));
- return false;
+ // Controle des points ortho uniquement pour full ortho.
+ if (impl.getCurrentProject().isFullOrtho()) {
+ if (impl.getCurrentProject().getOrthoPoints() == null) {
+ impl.error(PivResource.getS("Erreur"), PivResource.getS("Aucun point de r\xE9f\xE9rence au sol n'a \xE9t\xE9 d\xE9fini"));
+ return false;
+ }
+ String mes=impl.getCurrentProject().areOrthoPointsOk();
+ if (mes != null) {
+ impl.error(PivResource.getS("Erreur"), mes);
+ return false;
+ }
}
- String mes=impl.getCurrentProject().areOrthoPointsOk();
- if (mes!=null) {
- impl.error(PivResource.getS("Erreur"), mes);
- return false;
- }
if (impl.getCurrentProject().getOrthoParameters()==null) {
impl.error(PivResource.getS("Erreur"), PivResource.getS("Les param\xE8tres d'orthorectification n'ont pas \xE9t\xE9 donn\xE9s"));
return false;
Modified: trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/io/PivExeLauncher.java
===================================================================
--- trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/io/PivExeLauncher.java 2017-04-19 08:35:20 UTC (rev 9546)
+++ trunk/soft/fudaa-lspiv/src/main/java/org/fudaa/fudaa/piv/io/PivExeLauncher.java 2017-04-25 16:31:24 UTC (rev 9547)
@@ -1,5 +1,7 @@
package org.fudaa.fudaa.piv.io;
+import java.awt.Graphics2D;
+import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
@@ -13,11 +15,15 @@
import org.fudaa.ctulu.CtuluLibFile;
import org.fudaa.ctulu.CtuluLog;
import org.fudaa.ctulu.gui.CtuluTaskOperationGUI;
+import org.fudaa.ebli.geometrie.GrMorphisme;
+import org.fudaa.ebli.geometrie.GrPoint;
+import org.fudaa.ebli.geometrie.GrVecteur;
import org.fudaa.fudaa.piv.PivPreferences;
import org.fudaa.fudaa.piv.PivResource;
import org.fudaa.fudaa.piv.PivUtils;
import org.fudaa.fudaa.piv.imageio.PivPGMWriter;
import org.fudaa.fudaa.piv.metier.PivFlowResults;
+import org.fudaa.fudaa.piv.metier.PivOrthoParameters;
import org.fudaa.fudaa.piv.metier.PivOrthoPoint;
import org.fudaa.fudaa.piv.metier.PivProject;
import org.fudaa.fudaa.piv.metier.PivResultsI;
@@ -239,6 +245,111 @@
}
/**
+ * Lance le calcul de transformation des images sources a partir des parametres de scaling
+ * d'orthorectification.
+ *
+ * @param _ana L'analyse pour la tache ex\xE9cut\xE9e.
+ * @param _prj Le projet.
+ * @param _task La tache en cours d'execution.
+ * @param _apercu true : Ne calcule qu'une seule image, pour l'apercu en espace
+ * r\xE9el.
+ * @return true : Tout s'est bien d\xE9roul\xE9.
+ */
+ public boolean computeScalingImages(CtuluLog _ana, PivProject _prj, boolean _apercu, CtuluTaskOperationGUI _task) {
+ File prjRoot=_prj.getRoot();
+ File prjImgOut=new File(prjRoot,IMG_TRANSF_DIR);
+
+ // Nettoyage eventuel du repertoire des images transform\xE9es.
+ prjImgOut.mkdir();
+ for (File f : _prj.getTransfImageFiles()) f.delete();
+
+ try {
+ // Les images sources
+ File[] imgInp = _prj.getSrcImageFiles();
+
+ if (_task!=null)
+ _task.setProgression(10);
+ int prog=0;
+
+ PivOrthoParameters params=_prj.getOrthoParameters();
+
+ int maxIter=(_apercu?1:imgInp.length);
+ for (int i = 0; i <maxIter ; i++) {
+ try {
+ if (_prj.cacheExists(imgInp[i])) {
+ File cache = _prj.getCacheImageFile(imgInp[i]);
+ BufferedImage inputBuffer = ImageIO.read(cache);
+
+ int imin=(int) (params.getXmin() / params.getResolution());
+ int jmin=(int) (params.getYmin() / params.getResolution());
+ int imax=(int) (params.getXmax() / params.getResolution());
+ int jmax=(int) (params.getYmax() / params.getResolution());
+ BufferedImage outputBuffer=new BufferedImage(imax - imin, jmax - jmin, BufferedImage.TYPE_INT_ARGB);
+ Graphics2D g=(Graphics2D) outputBuffer.getGraphics();
+
+ // Pas de transformation
+ if (_prj.getOrthoParameters().getScalingImgPoints().length == 0) {
+ g.translate(-imin, inputBuffer.getHeight()-jmin);
+ g.scale(1, -1);
+ g.drawImage(inputBuffer, 0, 0, null);
+ }
+
+ // Translation / rotation
+ else {
+ GrPoint p1final = new GrPoint(params.getScalingRealPoints()[0].x_ / params.getResolution(), params.getScalingRealPoints()[0].y_ / params.getResolution(), 0);
+
+ // Calcul de l'angle de rotation depuis les points saisis.
+ GrVecteur v1=new GrVecteur(params.getScalingImgPoints()[1].x_-params.getScalingImgPoints()[0].x_, params.getScalingImgPoints()[1].y_-params.getScalingImgPoints()[0].y_, 0);
+ GrVecteur v2=new GrVecteur(params.getScalingRealPoints()[1].x_-params.getScalingRealPoints()[0].x_, params.getScalingRealPoints()[1].y_-params.getScalingRealPoints()[0].y_, 0);
+ double rotation=v1.getAngleXY(v2);
+
+ // Le premier point saisi dans le repere apr\xE8s rotation
+ GrMorphisme toRotation=GrMorphisme.rotationZ(rotation);
+ GrPoint p1rotation = params.getScalingImgPoints()[0].applique(toRotation);
+
+ // La transformation de l'espace de depart vers l'espace final (le 2ieme point n'est pas forcement la ou c'\xE9tait demand\xE9).
+ GrMorphisme toFinal = GrMorphisme.rotationZ(rotation).composition(GrMorphisme.translation(p1final.x_-p1rotation.x_-imin, p1final.y_-p1rotation.y_-jmin, 0));
+ AffineTransform transf = toFinal.creeAffineTransorm2D();
+
+ g.transform(transf);
+ // Retournement de l'image (car espace Graphics2D avec (0,0) en haut \xE0 gauche de l'image)
+ g.translate(0, inputBuffer.getHeight());
+ g.scale(1, -1);
+ g.drawImage(inputBuffer, 0, 0, null);
+ }
+
+ new PivPGMWriter().write(new File(prjImgOut, "image" + PivUtils.formatOn4Chars(i + 1) + "_transf.pgm"), outputBuffer);
+ }
+
+ if (_task!=null && _task.isStopRequested()) {
+ _ana.addError(PivResource.getS("Transformation interrompue"));
+ return false;
+ }
+ }
+ catch (IOException ex) {
+ _ana.addError(ex.getMessage());
+ return false;
+ }
+ prog=((i+1)*90)/maxIter;
+ if (_task!=null)
+ _task.setProgression(prog);
+
+ }
+ FuLog.trace(PivResource.getS("Transformation des images ok."));
+ }
+
+ // On signale au projet que les images transform\xE9es ont chang\xE9.
+ finally {
+
+ _prj.setTransfImagesChanged(_task);
+ if (_task!=null)
+ _task.setProgression(100);
+ }
+
+ return true;
+ }
+
+ /**
* Lance le calcul des coefficients d'orthorectification.
* @param _ana L'analyse pour la tache ex\xE9cut\xE9e.
* @param _prj Le projet.
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|