package active_contour;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;

public class main {
	
	/*
	 * Inicializácia parametrov pre metódu aktívnych kontúr s použitím gradientu
	 */
	// Stred definovanej kružnice, dany ako: POCET_STLPCOV*RIADOK + STLPEC, kde stred kruznice je potom (RIADOK,STLPEC)
	private static int startingPoint = 640*347 + 368;
	// Pocet iteracii
	private static int numberOfIter = 100;
	// Pocet inicializovaných bodov
	private static int numberOfPoints =1000;
	// Velkost okolia, v ktorom sa pocita energia a voli sa minimum
	private static int surround = 5;
	// Polomer kruznice
	private static int perimeter =51;
	
	/*
	//Priklad segmentacie metodou aktivnych kontur s vyuzitim gradientu, staci odkomentovat nasledovne riadky 
	// a zakomentovat vyssie zadane parametre + odkomentovat a povolit vykonanie metody. Subor, ktory sa ma otvorit: p112.jpg
	private static int startingPoint = 640*347 + 368;
	private static int numberOfIter = 100;
	private static int numberOfPoints =1000;
	private static int surround = 5;
	private static int perimeter =51;
	*/
	 
	
	
	/*
	 * Parametre pre metodu aktivnych kontur bez vyuzitia gradientu
	 */
	
	// Maximalny pocet iteracii
	private static int numberOfItera = 20;
	// Priemer kruznice
	private static double perimeter2 = 125;
	// Pociatok vyrezavanej oblasti v ose x
	private static int rowEnd = 40;
	// Pociatok vyrezavanej oblasti v ose y
	private static int rowStart = 85;
	// Velkost vyrezavanej oblasti v ose y
	private static int matrixSizeX =300;
	//Velkost vyrezavanej oblasti v ose x
	private static int matrixSizeY = 380;
	// Krok v priestorovej domene
	private static double stepH = 1;
	// Krok v casovej domene
	private static double stepT = 0.05;
	// Hodnota rychlostnej konstany
	private static double mu = 0.04;
	// Hodnota konstanty preferencie rozpinania sa krivky
	private static double vu = 0;
	// Suradnice x, respektive y pre stred pociatocnej kruznice
	private static int middleX = matrixSizeY/2-10;
	private static int middleY = matrixSizeX/2;
	
	/*
	 * Doporucene nastavenia pre spravnu segmentaciu. Nastavit fileToLoad na "t1.jpg", metoda bez vyuzitia gradientu
	 */
	
	/*
	// Maximalny pocet iteracii
	private static int numberOfItera = 10;
	// Priemer kruznice
	private static double perimeter2 = 120;
	// Pociatok vyrezavanej oblasti v ose x
	private static int rowEnd = 130;
	// Pociatok vyrezavanej oblasti v ose y
	private static int rowStart = 70;
	// Velkost vyrezavanej oblasti v ose y
	private static int matrixSizeX =300;
	//Velkost vyrezavanej oblasti v ose x
	private static int matrixSizeY = 400;
	// Krok v priestorovej domene
	private static double stepH = 1;
	// Krok v casovej domene
	private static double stepT = 0.05;
	// Hodnota rychlostnej konstany
	private static double mu = 0.04;
	// Hodnota konstanty preferencie rozpinania sa krivky
	private static double vu = 0;
	// Suradnice x, respektive y pre stred pociatocnej kruznice
	private static int middleX = matrixSizeY/2-10;
	private static int middleY = matrixSizeX/2;
	 */
	
	/*
	 * Doporucene nastavenia pre spravnu segmentaciu. Nastavit fileToLoad na "t18.jpg", metoda bez vyuzitia gradientu
	 */
	
	/*
	// Maximalny pocet iteracii
	private static int numberOfItera = 20;
	// Priemer kruznice
	private static double perimeter2 = 75;
	// Pociatok vyrezavanej oblasti v ose x
	private static int rowEnd = 90;
	// Pociatok vyrezavanej oblasti v ose y
	private static int rowStart = 70;
	// Velkost vyrezavanej oblasti v ose y
	private static int matrixSizeX =200;
	//Velkost vyrezavanej oblasti v ose x
	private static int matrixSizeY = 260;
	// Krok v priestorovej domene
	private static double stepH = 1;
	// Krok v casovej domene
	private static double stepT = 0.05;
	// Hodnota rychlostnej konstany
	private static double mu = 0.04;
	// Hodnota konstanty preferencie rozpinania sa krivky
	private static double vu = 0;
	// Suradnice x, respektive y pre stred pociatocnej kruznice
	private static int middleX = matrixSizeY/2-10;
	private static int middleY = matrixSizeX/2;
	 */
	
	/*
	 * Doporucene nastavenia pre spravnu segmentaciu. Nastavit fileToLoad na "t11.jpg", metoda bez vyuzitia gradientu
	 */
	
	/*
	// Maximalny pocet iteracii
	private static int numberOfItera = 10;
	// Priemer kruznice
	private static double perimeter2 = 105;
	// Pociatok vyrezavanej oblasti v ose x
	private static int rowEnd = 150;
	// Pociatok vyrezavanej oblasti v ose y
	private static int rowStart = 170;
	// Velkost vyrezavanej oblasti v ose y
	private static int matrixSizeX =300;
	//Velkost vyrezavanej oblasti v ose x
	private static int matrixSizeY = 360;
	// Krok v priestorovej domene
	private static double stepH = 1;
	// Krok v casovej domene
	private static double stepT = 0.05;
	// Hodnota rychlostnej konstany
	private static double mu = 0.04;
	// Hodnota konstanty preferencie rozpinania sa krivky
	private static double vu = 0;
	// Suradnice x, respektive y pre stred pociatocnej kruznice
	private static int middleX = matrixSizeY/2-10;
	private static int middleY = matrixSizeX/2;
	 */
	
	
	
	
	
	
	
	
	
	// Tuto metodu vykonava program
	public static void main(String[] args) {
			System.out.println("Pocita sa metoda aktivnych kontur, segmentuje sa oblast");
			// Nacitanie nativnych kniznic
			System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
			
			// Súbor, do ktoreho sa ulozi vysledok metody aktivnych kontur bez gradientu
			String file = "result_with_edges.png";
			// Subor, do ktoreho sa vlozi vysledok metody aktivnych kontur s gradientom
			String fileToSave = "result_without_edges.png";
			// Nacitavany subor
			String fileToLoad = "t5.jpg";
			// Vytvorenie objektu s nacitanym suborom
		    ImageProc source = new ImageProc(fileToLoad, "Nacitam obrazok...");
		    // Vypis rozmerov obrazku
		    System.out.println("Rozmery obrazku su: x: " +source.getNumCols() + " y: " +source.getNumRows());
		    
		    
		    
		    
		   
		    /**
		     * Je vyhodne realizovat iba jednu metodu, preto sa jedna vzdy zakomentuje. To je z dovodu rozdielnych nastaveni
		     */
		   
		    
		    
		    
		    // Vytvorenie objektu pre metódu aktivnych kontur s vyuzitim gradientu, pre jej vypocet, potreba odkomentovat tri riadky nizsie
		    /* 
		    ActiveContour activeCon = new ActiveContour(numberOfPoints, numberOfIter, surround, startingPoint, perimeter, source);
			activeCon.evolveCurve();
		    ImageProc resultImage =  new ImageProc(fileToLoad, file, activeCon.getCurve());
		    Imshow im = new Imshow("Active contours with edges");
		    im.showImage(resultImage.getResultImage());
			*/
		    
		    
		    
		    
		    // Vytvorenie a vypocet metody aktivnych kontur bez vyuzitia gradientu, pre realizaciu odkomentovat
		    ActiveContourWe acWe = new ActiveContourWe(source,middleX, middleY,  numberOfItera,  perimeter2, stepH, stepT, mu, vu , rowStart, rowEnd, matrixSizeX, matrixSizeY);
			ImageProc resultImageAcWe = new ImageProc(fileToLoad,fileToSave,acWe.getContour(), rowStart,rowEnd, matrixSizeX, matrixSizeY);
		    Imshow ima = new Imshow("Active contours without edges");
		    ima.showImage(resultImageAcWe.getResultImageAcWe());
		    

	}
}
