/* Last edited on 2003-07-08 21:09:34 by ra007998 */ #include #define N_LINHAS_SAIDA 10 char *txtcat (char *a, char *b) { char *r = malloc(strlen(a)+strlen(b)+1); if (r == NULL) { printf("txtcat - Não foi possivel alocar cadeia"); } strcpy(r, a); strcat(r, b); return(r); } /*ROTINA QUE PULA L LINHAS COM O PONTEIRO FP*/ int pulalinha(FILE *fp, int l) { char c; int i=0; fscanf(fp, "%c", &c); for (i=0; il-r)) { if (R) R[i]=maxcor; if (G) G[i]=maxcor; if (B) B[i]=maxcor; } } } return 1; } int main(int argc, char **argv) { int *R=NULL, *G=NULL, *B=NULL, *D=NULL, *E=NULL; int largura, altura, maxcor; int i=0;/*contador*/ int *m; double *mm; char *opcao; int ld=50,cd=40; double mi,mj; char *arq_in, *pref_out; if (argc!=4) { printf("Sintaxe: %s [arq entrada] [prefixo arqs saída] [opção].\n\n", argv[0]); printf("Opções:\n"); printf("1 - Copia a imagem de entrada no arquivo de saida;\n"); printf("2 - Transforma PPM em PGM;\n"); printf("3 - Pinta uma linha na imagem;\n"); printf("4 - Pinta as linhas reconhecidas automaticamente(ñ funciona).\n"); printf("5 - Produz imagem PGM com resultado do detetor local.(ñ está bom. Opção 6 tenta corrigir.\n"); printf("6 - Produz imagem PGM com resultado do detetor local com pesos.\n"); printf("7 - Detecta um cruzamento aproximado com precisão de meio pixel.\n"); printf("8 - Pinta as linhas reconhecidas automaticamente(em testes).\n"); printf("9 - Pinta as linhas reconhecidas automaticamente usando o detector local de 6.\n"); printf("H - Help.\n\n"); return 0; } arq_in = argv[1]; pref_out = argv[2]; opcao = argv[3]; switch(opcao[0]) { case '1': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); salvaimagem(6, R, G, B, txtcat(pref_out, ".ppm"), largura, altura, maxcor); break; case '2': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); for (i=0; i<(largura*altura); i++) R[i] = (R[i]+G[i]+B[i])/3; salvaimagem(5, R, NULL, NULL, txtcat(pref_out, ".pgm"), largura, altura, maxcor); break; case '3': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); pinta(100,90,R,G,B,largura,altura,maxcor/4); pinta(-100,45,R,G,B,largura,altura,maxcor/4); pinta(200,45,R,G,B,largura,altura,maxcor/4); pinta(100,60,R,G,B,largura,altura,maxcor/4); pinta(100,63,R,G,B,largura,altura,maxcor/4); salvaimagem(5, R, NULL, NULL, txtcat(pref_out, ".pgm"), largura, altura, maxcor); break; case '4': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); m = extrailinhas(10,R,largura,altura); for (i=0; i<10; i++) { pinta(m[i],m[2*i],R,NULL,NULL,largura,altura,maxcor); } free(m); salvaimagem(5, R, NULL, NULL, txtcat(pref_out, ".pgm"), largura, altura, maxcor); break; case '5': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); alocaimagemcinza(&D, largura, altura); detectalinhas(R,largura,altura,D); salvaimagem(5, D, NULL, NULL, txtcat(pref_out, ".pgm"), largura, altura, maxcor); break; case '6': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); alocaimagemcinza(&D, largura, altura); alocaimagemcinza(&E, largura, altura); detecta_linhas_usando_pesos(R,largura,altura,D,E,NULL); salvaimagem(5, D, NULL, NULL, txtcat(pref_out, ".pgm"), largura, altura, maxcor); salvaimagem(5, E, NULL, NULL, txtcat(pref_out, "-t.pgm"), largura, altura, maxcor); break; case '7': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); detectacruzamentos(R,largura,altura,ld,cd,&mi,&mj); printf("Ponto aproximado: (%d, %d)\n", ld, cd); printf("Ponto exato: (%g, %g)\n\n", mi, mj); break; case '8': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); mm = detectalinhas2(10,R,largura,altura); for (i=1; i<=10; i++) { // printf("teta: (%d) L: (%d)\n", mm[i], mm[i+10]); pinta(mm[i+10],mm[i],R,NULL,NULL,largura,altura,maxcor); } free(mm); salvaimagem(5, R, NULL, NULL, txtcat(pref_out, ".pgm"), largura, altura, maxcor); break; case '9': carregaimagem(&R, &G, &B, arq_in, &largura, &altura, &maxcor); alocaimagemcinza(&D, largura, altura); alocaimagemcinza(&E, largura, altura); mm = extrai_linhas_com_pesos(N_LINHAS_SAIDA,R,D,E,largura,altura,pref_out); salvaimagem(5, D, NULL, NULL, txtcat(pref_out, "-local.pgm"), largura, altura, maxcor); salvaimagem(5, E, NULL, NULL, txtcat(pref_out, "-teta.pgm"), largura, altura, maxcor); int nlinhas = (int)(mm[0] + 0.5); printf("melhores retas encontradas:\n"); for (i=1; i<=mm[0]; i++) { double teta = mm[i]; double dist = mm[i+nlinhas]; double peso = mm[i+2*nlinhas]; printf("teta = %f L = %f peso = %f\n", teta, dist, peso); pinta(dist,teta,D,NULL,NULL,largura,altura,maxcor); pinta(dist,teta,D,NULL,NULL,largura,altura,maxcor); } if (mm) free(mm); salvaimagem(5, D, NULL, NULL, txtcat(pref_out, ".pgm"), largura, altura, maxcor); break; case 'H': printf("---------HELP--------\n"); printf("Opção"); printf(" 1 - Um novo arquivo é criado, com o mesmo conteúdo do arquivo original\n"); printf(" 2 - Cria uma nova imagem PGM na qual cada pixel é a média dos três canais da imagem de entrada PPM\n"); printf(" 3 - Pinta uma linha branca na imagem de entrada, a partir de um ângulo(teta) e uma distância (L) em relação à origem\n"); printf(" 4 - Pinta as linhas reconhecidas automaticamente(ñ funciona).\n"); printf(" 5 - A partir da entrada PPM, gera uma imagem PGM com resultado do detetor local, isto é,\n"); printf(" dá uma nota para cada pixel. Esta nota é maior, quanto mais provável que este pixel \n"); printf(" pertença a alguma linha do grid. (ñ está bom. Opção 6 tenta corrigir.\n"); printf(" 6 - Produz imagem PGM com resultado do detetor local com pesos.\n"); printf(" 7 - Detecta um cruzamento aproximado com precisão de meio pixel.\n"); printf(" 8 - Pinta as linhas reconhecidas automaticamente(em testes).\n"); printf(" 9 - Pinta as linhas reconhecidas automaticamente(usando máscaras de pesos).\n"); printf(" H - Mostra esta mini Ajuda.\n\n\n"); break; } if (R) free(R); if (G) free(G); if (B) free(B); if (D) free(D); if (E) free(E); return 0; }