Deteccion del valor de monedas y contador de la suma total en € de las monedas en una imagen

beruby - te devolvemos dinero por tus compras y reservas online
A continuación voy a mostraros como realizar un contador de monedas y a la vez detector de la cantidad de las mismas que nos permite obtener el valor en € del total de monedas en una imagen.
La única necesidad para que este detector funcione, es que deben aparecer en la imagen al menos 1 moneda de cada tipo (ya que en caso contrario, tendríamos que modificar el código del calculo del área de las monedas y añadir manualmente el área de cada uno de los tipos de monedas para poder detectar las monedas).

El proceso para poder realizar este programa consiste en 2 pasos:

1- Detección del numero de monedas existentes en la imagen.

2- Cálculo del valor de cada una de las monedas de la imagen (y suma de los valores de cada una de las monedas de la imagen para obtener el total en €).

Programa con codigo, archivos .m e imagenes:

http://www.mediafire.com/download/t5quqxi3orcqp68/deteccion_de_monedas_y_su_valor.rar

Código:
%contador de dinero en función de las monedas y de su valor.
clear all
im_rgb=imread('monedas.jpg','jpg');
figure(1),imshow(im_rgb)
Im_bin=im2bw(im_rgb,0.7);
Im_bin=not(Im_bin);
monedasimagen=imfill(Im_bin,'hole');%relleno el interior de las monedas
figure(2),imshow(monedasimagen)
[a b]=bwlabel(monedasimagen,8);


propiedades=regionprops(a,'area','centroid','BoundingBox');
moneda1=0;moneda2=0;moneda5=0;moneda10=0;moneda20=0;moneda50=0;moneda100=0;moneda200=0;
[w v]=size(propiedades(:,1))
%calculo del area de las monedas( solo si aparecen todas las monedas en la
%imagen, en caso contrario tendriamos que hacer un script especifico para dicha imagen editando este script)
for (i=1:w)
    area(i)=propiedades(i).Area;
end
%eliminar elementos repetido del vector area:
area=sort(area);
salir=0;
i=1;
while salir==0
    if (i>(w-2))
        salir=1;
    end
    if (area(i+1)-area(1)/100)<=area(i) && area(i)<=(area(i+1)+area(1)/100);
        for j=i+1:w-1
            variable=area(j+1);
            area(j+1)=area(j);
            area(j)=variable;
        end
        w=w-1;
    else
        i=i+1;
    end
  
end


 area1=area(1);
 area2=area(2);
 area10=area(3);
 area5=area(4);
 area20=area(5);
 area100=area(6);
 area50=area(7);
 area200=area(8);


%aqui se acaba el calculo del area y comienza la comparacion de las monedas
%para obtener su valor
total=0;
for i=1:size(propiedades,1)
    rectangle('position',propiedades(i).BoundingBox,'edgecolor','r','linewidth',3)
    centro=propiedades(i).Centroid;
    x=centro(1);y=centro(2);
    propiedades(i).Area
    if  propiedades(i).Area<=area1+area(1)/100
        text(x-area(8)/2400,y,'1 ')
        total=total+0.01;
        moneda1=moneda1+1;
    elseif propiedades(i).Area<=area2+area(1)/100
        text(x-area(8)/2400,y,'2 ')
        total=total+0.02;
        moneda2=moneda2+1;
    elseif propiedades(i).Area<=area10+area(1)/100
        text(x-area(8)/2000,y,'10 ')
        total=total+0.10;
        moneda10=moneda10+1;
    elseif propiedades(i).Area<=area5+area(1)/100
        text(x-area(8)/2400,y,'5 ')
        total=total+0.05;
        moneda5=moneda5+1;
    elseif propiedades(i).Area<=area20+area(1)/100
        text(x-area(8)/1500,y,'20 ')
        total=total+0.20;
        moneda20=moneda20+1;
    elseif propiedades(i).Area<=area100+area(1)/100
        text(x-area(8)/1500,y,'100 ')
        total=total+1;
        moneda100=moneda100+1;
    elseif propiedades(i).Area<=area50+area(1)/100
        text(x-area(8)/1500,y,'50 ')
        total=total+0.5;
        moneda50=moneda50+1;
    elseif propiedades(i).Area<=area200+area(1)/100
        text(x-area(8)/1500,y,'200 ')
        total=total+2;
        moneda200=moneda200+1;
    end

end
    sprintf('total de dinero:%0.2f € ',total)
Resultados:
Imagen original:

Al ejecutar el código con la siguiente imagen:
obtenemos como imagen:
En la que observamos que cada moneda esta correctamente enumerada con su valor en céntimos
Y en la linea de comandos de Matlab se obtiene "total de dinero:5.13 € " que es la suma del valor de las monedas de la imagen en €.

 Entrada principal

3 comentarios:

  1. Buen trabajo, Ignacio!! Justo lo que me hacía falta para un trabajo de la carrera, gracias!

    ResponderEliminar
  2. Buenas tengo una duda en una parte del código:
    if (area(i+1)-area(1)/100)<=area(i) && area(i)<=(area(i+1)+area(1)/100);
    for j=i+1:w-1
    variable=area(j+1);
    area(j+1)=area(j);
    area(j)=variable;
    end
    w=w-1;
    else
    i=i+1;
    end
    Es esta parte en concreto, no entiendo la condición del if.
    Me sería de gran ayuda si me lo explicasen. Gracias

    ResponderEliminar