Advertisement
Guest User

Untitled

a guest
Mar 1st, 2015
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.25 KB | None | 0 0
  1. #include "trabalho3.h"
  2. #include <math.h>
  3. #define ROTULO_I 1 //menor rotulo, criado para testes de rotulação
  4. #define WINSIZE 3
  5. #define MIN(a,b) ((a<b)? a : b)
  6.  
  7. void detectaSensorBar (Imagem1C* img, Coordenada* l, Coordenada* r, double* angulo){
  8.         int i,j, r_bola1=ROTULO_I, r_bola2;
  9.         Imagem1C *matrizTemporaria =(Imagem1C *)malloc(sizeof(Imagem1C));
  10.         matrizTemporaria = criaImagem1C(img->largura, img->altura);
  11.          for(i=0;i<matrizTemporaria->altura;i++)
  12.                 for(j=0;j<matrizTemporaria->largura;j++)
  13.             matrizTemporaria->dados[i][j]=0;
  14.  
  15.     filtroMedia(img, matrizTemporaria);
  16.         binariza(matrizTemporaria, matrizTemporaria, 163);
  17.         *img=*matrizTemporaria;
  18.         r_bola2 = atribuiRotulos(matrizTemporaria, img);
  19.         organiza_coordenada(l, r, r_bola2, img);
  20.         calculaAngulo(r, l, angulo);
  21. }
  22.  
  23. void calculaAngulo(Coordenada* r, Coordenada* l, double *angulo){
  24.     double horizontal, vertical;
  25.     horizontal =(double) r->x - l->x;
  26.     vertical =(double) abs(r->y - l->y);
  27.     *angulo = atan2(vertical,horizontal)* 180 / M_PI;
  28. }
  29.  
  30.  
  31. void calculaCentro(Coordenada* bola,Imagem1C* img, int rotulo){
  32.     int i, j, verificador=0;
  33.     int x1, x2, y1, y2;
  34.     Coordenada centro;
  35.     for(i=1; i<img->altura-1&&verificador==0; i++){
  36.         for(j=1; j<img->largura-1; j++){
  37.             if(img->dados[i][j]==rotulo){
  38.                 verificador=1;
  39.                 x1=j;
  40.                 y1=i;
  41.                 break;
  42.                 }
  43.         }
  44.     }
  45.     verificador=0;
  46.     for(i=img->altura-2; i>0&&verificador==0; i--){
  47.         for(j=img->largura-2; j>0; j--){
  48.             if(img->dados[i][j]==rotulo){
  49.                 verificador=1;
  50.                 x2=j;
  51.                 y2=i;
  52.                 break;
  53.             }
  54.         }
  55.     }
  56.     bola->x = (x1+x2)/2;
  57.     bola->y = (y1+y2)/2;
  58.     return &centro;
  59.  
  60. }
  61.  
  62. void organiza_coordenada(Coordenada* l, Coordenada* r, int rotulo2, Imagem1C* img){
  63.     int i, j;
  64.     Coordenada bola1, bola2;
  65.     calculaCentro(&bola1, img, ROTULO_I);
  66.     calculaCentro(&bola2, img, rotulo2);
  67.     if(bola1.x > bola2.x){
  68.         l->x=bola2.x;
  69.         l->y=bola2.y;
  70.         r->x=bola1.x;
  71.         r->y=bola1.y;
  72.     }
  73.     else{
  74.         l->x=bola1.x;
  75.         l->y=bola1.y;
  76.         r->x=bola2.x;
  77.         r->y=bola2.y;
  78.     }
  79. }
  80.  
  81. //Função ra calcular o menor valor diferente de 0
  82.  
  83. int menor_valor(a, b, c, d){
  84.     int v[4], menor, i, cont=0;
  85.     if(a!=0){
  86.         v[cont]=a;
  87.         cont++;
  88.     }
  89.     if(b!=0){
  90.         v[cont]=b;
  91.         cont++;
  92.     }
  93.     if(c!=0){
  94.         v[cont]=c;
  95.         cont++;
  96.     }
  97.     if(d!=0){
  98.         v[cont]=d;
  99.         cont++;
  100.     }
  101.     menor=v[0];
  102.     for(i=1; i<cont; i++){
  103.         menor =MIN(menor, v[i]);
  104.     }
  105.     return menor;
  106. }
  107.  
  108.  
  109. void varreduraForward(Imagem1C* in, Imagem1C* out, int *verificador){
  110.     int i, j, inicial;
  111.     for(i=1; i<in -> altura-1; i++){
  112.         for(j=1; j< in ->largura-1; j++){
  113.             if(in->dados[i][j] > 0){
  114.                 if(in->dados[i-1][j-1]!=0||in->dados[i][j-1]!=0 || in->dados[i-1][j]!=0 ||in->dados[i-1][j+1]!=0){
  115.                     inicial=out->dados[i][j];
  116.                     out->dados[i][j]= menor_valor(in->dados[i-1][j-1], in->dados[i][j-1], in->dados[i-1][j], in->dados[i-1][j+1]);
  117.  
  118.                 }
  119.             }
  120.             if(*verificador==0){
  121.                 if(in->dados[i][j]!=out->dados[i][j]){
  122.                     *verificador=1;
  123.                 }
  124.             }
  125.         }
  126.     }
  127.  
  128. }
  129.  
  130.  
  131. void varreduraBackward(Imagem1C* in, Imagem1C* out, int *verificador){
  132.  
  133.     int i, j, inicial;
  134.     for(i=in->altura-1; i>0; i--){
  135.         for(j=in->largura-1; j>0; j--){
  136.             if(in->dados[i][j]>0){
  137.                 if(in->dados[i+1][j+1]!=0||in->dados[i][j+1]!=0 || in->dados[i+1][j]!=0 ||in->dados[i+1][j-1]){
  138.                     inicial = out->dados[i][j];
  139.                     out->dados[i][j]= menor_valor(in->dados[i+1][j+1], in->dados[i][j+1], in->dados[i+1][j], in->dados[i+1][j-1]);
  140.                 }
  141.             }
  142.             if(*verificador=0)
  143.                 if(in->dados[i][j]!=out->dados[i][j]){
  144.                     *verificador = 1;
  145.  
  146.             }
  147.         }
  148.     }
  149.  
  150. }
  151.  
  152.  
  153. int atribuiRotulos(Imagem1C* in, Imagem1C* out){
  154.     int rotulo = ROTULO_I, verificador, i, j;
  155.     for(i=1; i<in->altura-1; i++){
  156.         for(j=1; j< in->largura-1 ; j++){
  157.             if(in->dados[i][j]>0){
  158.                 if(in->dados[i-1][j-1]==0 && in->dados[i][j-1]==0 && in->dados[i-1][j]==0&&in->dados[i-1][j+1]==0){
  159.                     out->dados[i][j]=rotulo;
  160.                     rotulo++;
  161.                 }
  162.                 else if(in->dados[i-1][j-1]!=0||in->dados[i][j-1]!=0 || in->dados[i-1][j]!=0 ||in->dados[i-1][j+1]!=0){
  163.                     out->dados[i][j]= menor_valor(in->dados[i-1][j-1], in->dados[i][j-1], in->dados[i-1][j], in->dados[i-1][j+1]);
  164.                 }
  165.             }
  166.         }
  167.  
  168.     }
  169.  
  170.  
  171.     do{
  172.         *in = *out;
  173.         verificador=0;
  174.         varreduraBackward(in, out, &verificador);
  175.         varreduraForward(in, out, &verificador);
  176.     }while(verificador==1);
  177.     for(i=0; i<out->altura; i++){
  178.         for(j=0; j<out->largura; j++){
  179.             if(rotulo>out->dados[i][j]&&out->dados[i][j]>ROTULO_I)
  180.                 rotulo=out->dados[i][j];
  181.         }
  182.     }
  183.  
  184.     return rotulo;
  185. }
  186.  
  187. void filtroMedia(Imagem1C* img, Imagem1C* out){
  188.         int i, j, k, media, tamanho = WINSIZE / 2;
  189.  
  190.         for(i=0;i<tamanho;i++)
  191.                 for(j=0;j<(img->largura-tamanho);j++)
  192.                         out->dados[i][j] = 0;
  193.         for(i=((img->altura)-tamanho);i<img->altura;i++)
  194.                 for(j=0;j<(img->largura-tamanho);j++)
  195.                         out->dados[i][j] = 0;
  196.  
  197.         for(i=tamanho; i<img->altura-tamanho; i++)
  198.                 for(j=0;j<tamanho;j++)
  199.                         out->dados[i][j] = 0;
  200.  
  201.         for(i=tamanho; i<img->altura-tamanho; i++)
  202.                 for(j=img->largura-tamanho;j<img->largura;j++)
  203.                         out->dados[i][j] = 0;
  204.  
  205.         for (i = tamanho; i < (img->altura-tamanho); i++){
  206.                 for (j = tamanho; j < (img->largura-tamanho); j++){
  207.                         media = img->dados[i][j];
  208.                         for(k = 1; k <= tamanho; k++){
  209.                                 media += img->dados[i+k][j];
  210.                                 media += img->dados[i][j+k];
  211.                                 media += img->dados[i+k][j+k];
  212.                                 media += img->dados[i-k][j];
  213.                                 media += img->dados[i][j-k];
  214.                                 media += img->dados[i-k][j-k];
  215.                                 media += img->dados[i+k][j-k];
  216.                                 media += img->dados[i-k][j+k];
  217.                         }
  218.                         media /= (WINSIZE*WINSIZE);
  219.                         out->dados[i][j] = media;
  220.                 }
  221.         }
  222. }
  223.  
  224. void binariza(Imagem1C* img, Imagem1C* out, int limiar)
  225. {
  226.         int i, j;
  227.  
  228.         for (i = 0; i < img->altura; i++)
  229.                 for (j = 0; j < img->largura; j++)
  230.                         if(img->dados[i][j]>limiar)
  231.                                 out->dados[i][j] = 255;
  232.                         else
  233.                                 out->dados[i][j] = 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement