/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package testejavadesktop; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Calendar; /** * * @author Administrator */ public class CTestes { public static String ExecutaTestes(boolean CarregaArquivos, boolean SalvaErradas, boolean UsaServidorImagens) throws IOException { String retorno = ""; TParamsDir ParamsDir = new TParamsDir(); TParamsIni ParamsIni = new TParamsIni(ParamsDir.getDirBase() + "ParamsTP.ini"); CResultadosTeste ResultadosTeste=new CResultadosTeste(); String PastaBase = ParamsDir.getDir("DiretorioSelecionadas"); long tempo1 = System.currentTimeMillis(); CArquivosTeste ArquivosTeste; if (UsaServidorImagens) { ArquivosTeste = new CClienteSocket().RecebeArquivosTeste(); } else { ArquivosTeste = new CArquivosTeste(PastaBase, CarregaArquivos); } long tempo2 = System.currentTimeMillis(); CalculaAcertos(ParamsIni, ArquivosTeste, SalvaErradas, ResultadosTeste); for (int n = 0; n < 7; n++) { retorno += CNota.NotaPorIndice(n) + ": " + ResultadosTeste.ProporcaoAcertos[n] * 100.0 + "\n"; } retorno += "\n"; retorno+="Acertos geral: "+ResultadosTeste.AcertoGeral()+"\n"; retorno += "\n"; for (int n = 0; n < 7; n++) { retorno += CNota.NotaPorIndice(n) + "\t"; } retorno += "\n"; for (int n = 0; n < 7; n++) { retorno += ResultadosTeste.MatrizConfusao.RetornaString(n) + "\n"; } retorno += "\n"; for (int n = 0; n < 7; n++) { retorno += ResultadosTeste.MatrizConfusao.RetornaStringPorcentagem(n) + "\n"; } retorno += "Carga arquivos: " + new Double((tempo2 - tempo1) / 1000.0).toString() + "\n"; retorno += "Reconhecimentos: " + new Double((System.currentTimeMillis() - tempo2) / 1000.0).toString() + "\n"; FileWriter outFile; PrintWriter out; String caminho_arq=ParamsDir.getDir("DiretorioLogs")+NomeLog(); String caminho_ultimo_log=ParamsDir.getDir("DiretorioLogs")+"ultimo_log.txt"; try { outFile = new FileWriter(caminho_arq); out = new PrintWriter(outFile); out.println(retorno); out.close(); outFile = new FileWriter(caminho_ultimo_log); out = new PrintWriter(outFile); out.println(retorno); out.close(); } catch (IOException ex) { COutputDebug.WriteOutput("Erro ao abrir o arquivo " + caminho_arq+ "\n"+ex.getMessage()); } return retorno; } public static void CalculaAcertos(TParamsIni ParamsIni, CArquivosTeste ArquivosTeste, boolean SalvaErradas, CResultadosTeste ResultadosTeste) { TParamsDir ParamsDir = new TParamsDir(); int NumNotas, Acertos; CNota NotaTemp; for (int n = 0; n < ArquivosTeste.NumNotas(); n++) { CImagensNota ImagensNota = ArquivosTeste.ImagensNota(n); NumNotas = 0; Acertos = 0; System.out.println("Nota: " + n); for (int i = 0; i < ImagensNota.NumElementos(); i++) { NotaTemp = ImagensNota.Imagens(i); TParamsRC ParamsRC; if (SalvaErradas) { //inicializa uma imagem de debug que vai ser salva no diretório especificado ParamsRC = new TParamsRC(ParamsIni, new CTonsCinza(NotaTemp.imagem), new CBitmap(NotaTemp.imagem), new CBitmap(NotaTemp.imagem)); COutputDebug.InicializaArquivo(); } else { ParamsRC = new TParamsRC(ParamsIni, new CTonsCinza(NotaTemp.imagem), null, new CBitmap(NotaTemp.imagem)); } UTioPatinhas.ReconheceCedula(ParamsRC); NumNotas++; if ((i % 10) == 0) { System.out.println(i); } if (ImagensNota.nota == ParamsRC.ParamsAI.ValorCedula) { Acertos++; } else { if (SalvaErradas) { BMPFile bmpFile = new BMPFile(); String nome_arq_destino = ParamsDir.getDir("DiretorioErradas") + ImagensNota.nota + "_" + ParamsRC.ParamsAI.ValorCedula + "_" + System.currentTimeMillis() + "_" + NotaTemp.arquivo; bmpFile.saveBitmap(nome_arq_destino, ParamsRC.ParamsMLT.BImgDest.SaveImage(), 320, 240); nome_arq_destino = nome_arq_destino.substring(0, nome_arq_destino.length() - 4); COutputDebug.WriteOutput("\n" + ParamsRC.dump()); COutputDebug.FechaArquivo(nome_arq_destino + ".txt"); } } ResultadosTeste.MatrizConfusao.AdicionaReconhecimento( ImagensNota.nota, ParamsRC.ParamsAI.ValorCedula); } ResultadosTeste.ProporcaoAcertos[n] = Acertos * 1.0 / NumNotas; ResultadosTeste.NumNotasTotal+=NumNotas; ResultadosTeste.NumAcertosTotal+=Acertos; } } private static String NomeLog() { java.text.DecimalFormat nft = new java.text.DecimalFormat("#00.###"); nft.setDecimalSeparatorAlwaysShown(false); int ano=Calendar.getInstance().get(Calendar.YEAR); int mes=Calendar.getInstance().get(Calendar.MONTH); int dia=Calendar.getInstance().get(Calendar.DAY_OF_MONTH); int hora=Calendar.getInstance().get(Calendar.HOUR_OF_DAY); int minuto=Calendar.getInstance().get(Calendar.MINUTE); int segundo=Calendar.getInstance().get(Calendar.SECOND); String caminho_arq= ano+"-"+ nft.format(mes)+"-"+ nft.format(dia)+"_"+ nft.format(hora)+"-"+ nft.format(minuto)+"-"+ nft.format(segundo)+".txt"; return caminho_arq; } } class CResultadosTeste { double[] ProporcaoAcertos; int NumNotasTotal; int NumAcertosTotal; StringMatrizConfusao MatrizConfusao; public CResultadosTeste() { ProporcaoAcertos=new double [7]; NumNotasTotal=0; NumAcertosTotal=0; MatrizConfusao = new StringMatrizConfusao(); } public double AcertoGeral() { return NumAcertosTotal*100.0/NumNotasTotal; } } class StringMatrizConfusao { private int[][] matriz; private int[] total; public StringMatrizConfusao() { matriz = new int[7][8]; total = new int[7]; } private int ValorParaIndice(int valor) { switch (valor) { case 1: return 0; case 2: return 1; case 5: return 2; case 10: return 3; case 20: return 4; case 50: return 5; case 100: return 6; } return 7; } public void AdicionaReconhecimento(int valor_esperado, int valor_reconhecido) { total[ValorParaIndice(valor_esperado)]++; matriz[ValorParaIndice(valor_esperado)][ValorParaIndice(valor_reconhecido)]++; } public String RetornaString(int indice) { /*return "1: " + matriz[indice][0] + "; 2: " + matriz[indice][1] + "; 5: " + matriz[indice][2] + "; 10: " + matriz[indice][3] + "; 20: " + matriz[indice][4] + "; 50: " + matriz[indice][5] + "; 100: " + matriz[indice][6]+"; Não reconhecido: "+matriz[indice][7];*/ return matriz[indice][0] + "\t" + matriz[indice][1] + "\t" + matriz[indice][2] + "\t" + matriz[indice][3] + "\t" + matriz[indice][4] + "\t" + matriz[indice][5] + "\t" + matriz[indice][6] + "\t" + matriz[indice][7]; } public String RetornaStringPorcentagem(int indice) { String retorno = ""; for (int i = 0; i < 8; i++) { retorno += CDesktopFuncs.FormataPorcentagem(matriz[indice][i] * 1.0 / total[indice]) + "\t"; } return retorno; } }