Deteccion del valor de monedas y contador de la suma total en € de las monedas en una imagen
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
Suscribirse a:
Enviar comentarios (Atom)
Buen trabajo, Ignacio!! Justo lo que me hacía falta para un trabajo de la carrera, gracias!
ResponderEliminargenial ignacio no creo que esto fuera posible
ResponderEliminarBuenas tengo una duda en una parte del código:
ResponderEliminarif (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