-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.cpp
143 lines (126 loc) · 4.2 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <opencv2/opencv.hpp>
#include "util.hpp"
#include "preprocess.hpp"
#include "visao.hpp"
#include "mlp.hpp"
#define BITS 8
using namespace std;
/* error codes:
-1: argumentos não informados
-2: não foi possível abrir o arquivo para escrita da saída
-3: não foi possível abrir o arquivo de saída do treinamento
-4: não foi possível abrir a imagem de treinamento
*/
int main(int argc, char ** argv) {
char cmd[500], opt, dic[500];
int page = 1;
FILE * output;
Mat src;
// verifica se foi passado o pdf como argumento
if(argc < 2) {
cout << "O arquivo .pdf de entrada ou uma opção deve ser informada!\nOpções:\n\t-h : ajuda\n\t-t : treinar rede\n";
return -1;
}
if(argv[1][0] == '-' && argv[1][1] == 't') {
int textLen, ** textBin;
char outputName[200], inputName[200], charRead;
FILE * desiredOutput;
cout << "Insira a imagem de treinamento";
cin >> inputName;
if(!Preprocess(inputName, &src)) {
cout << "Não foi possível abrir a imagem de treinamento.\n";
return -4; // joga um erro se não conseguir abrir a imagem
}
cout << "Insira a saída esperada para o treinamento: ";
cin >> outputName;
if((desiredOutput = fopen(outputName, "r")) == NULL) {
cout << "Não foi possível abrir a saída do treinamento.\n";
return -3;
}
// lê o texto da saída
textLen = FileLen(outputName, true);
textBin = (char **) malloc(textLen * sizeof(char *));
for(int i = 0; i < textLen;) {
// aloca os vetores binários
textBin[i] = (int *) malloc(BITS * sizeof(int));
charRead = fgetc(desiredOutput);
if(charRead == '\n')
continue;
// converte o caractere e armazena no vetor
Char2Bin(charRead, textBin[i], BITS);
// aqui embaixo pq se o char for uma quebra de linha ele não é contabilizado
i++;
}
// pre-processar imagem
// processar
// pra cada letra, chamar a mlp passando a matriz da letra e a letra lida corresopndente
}
else {
// tenta abrir o output
if((output = fopen("outputTemp1.txt", "w")) == NULL) {
cout << "Não foi possível inicializar o arquivo de saída. Verifique se temos permissão para escrita neste diretório.\n";
return -2;
}
cout << "Convertendo .pdf para .png...\n";
// cria uma pasta temporária
system("mkdir temp");
// cria o comando
strcpy(cmd, "pdftoppm -png ");
strcat(cmd, argv[1]);
strcat(cmd, " temp/tdn");
// converte o pdf para páginas em png
system(cmd);
// as páginas são armazenandas em "temp/tdn-X.png", onde X é o número da página
cout << "Arquivo convertido.\n";
// para cada página executa a detecção, concatenando o resultado
strcpy(cmd, "temp/tdn-1.png");
while(fopen(cmd, "r") != NULL) {
cout << "Processando " << cmd << "\n";
if(!Preprocess(cmd, &src)) {
cout << "Não foi possível abrir a imagem de treinamento.\n";
return -4; // joga um erro se não conseguir abrir a imagem
}
// detecção
// Encontrar linhas (limites em y)
// Encontra caracteres (limites em x)
// Converte a submatriz do caractere pra escala padrão de entrada do MLP
// Reconhecimento (para cada caractere)
// Envia a matriz para o MLP
// Salva o caractere reconhecido na string de saída temporária
// (Fase de aprendizado) Compara com o resultado esperado e propaga os erros
for(int ch = 0; ch < chcount; ch++) {
outChar = MLP.Process(window[ch]);
fputc(outChar, output);
}
// fim do processamento
page++;
// recria a string só pra saber se existe a próxima página
strcpy(cmd, "temp/tdn-");
strcat(cmd, Int2string(page));
strcat(cmd, ".png");
}
// fecha o arquivo, não precisamos mais escrever nele
fclose(output);
// apaga a pasta temporária
system("rm -R temp");
// módulo de correção
cout << "Deseja rodar uma autocorreção de erros (s/n)? ";
cin >> opt;
if(opt == 's') {
cout << "Entre com o dicionário correspondente ao idioma do arquivo: ";
cin >> dic;
AutoCorrect("outputTemp1.txt", dic);
}
system("mv outputTemp1.txt output.txt");
// mostra resultados
cout << "Deseja exibir os resultados (s/n)?";
cin >> opt;
if(opt == 's') {
system("cat output.txt");
}
} // endif
return 0;
}