martes, 17 de octubre de 2017

Lector de partituras a partir de una imagen

Esta vez, se me ha ocurrido hacer un lector de partituras a partir de una imagen (jpg o cualquier cosa me vale) y como salida, lo convertire a codigo para arduino (en un txt). Esta es la idea original, a saber que sale al final, si es que sale algo. He decidido escoger una partitura bastante sencilla. En concreto, esta del himno de la alegria:


Para hacerlo, utilizare LabVIEW. Concretamente, comenzare utilizando el Vision Builder.

Lo primero que he hecho (aparte de introducir la imagen de prueba en el programa), es detectar objetos. La idea mia ha sido detectar cada uno de los pentagramas individualmente y tratarlos por separado mas adelante.




A continuacion, escojo el primer punto de referencia en el primer pentagrama detectado, para trabajar sobre el.


A continuacion, aunque en este caso tal vez os parezca innecesario y es posible que creais que no tiene mucho sentido, extraigo la capa roja. Con esto, basicamente lo que hago es quitar el color a la imagen y dejarla en blanco y negro. Aunque la imagen ya estaba en blanco y negro, esta tonteria me ha ayudado bastante en un paso bastante mas adelante, a la hora de detectar objetos (mas adelante explicare en que consiste).


El mayor problema con diferencia que he tenido hasta este punto, es que la localizacion del punto de referencia de cada uno de los pentagramas es ligeramente distinto. Segun he estado investigando, eso es porque el Vision Builder utiliza como centro el punto medio de la suma de los pixeles utilizados. Por decirlo de otra manera, el punto medio no es el punto medio del area verde que podeis ver en la imagen (que es lo que cabria esperar), sino el punto medio de la suma de cada uno de los pixeles detectados a color negro. Por ello, el punto medio de cada uno de las areas se encuentra en un punto ligeramente distinto y esto me ha ocasionado bastantes problemas a la hora de localizar las notas.

Para solucionar esto, he tenido que utilizar como referencia el punto de referencia hallado anteriormente y a partir de el, localizar dos lineas rectas en la imagen. La primera, la linea superior horizontal del pentagrama (podia haber escogido la de abajo, me daria igual) y la segunda, la linea vertical derecha (Esta ya no da igual, la he escogido porque es una linea recta facil de localizar). Como punto de referencia voy a escoger el vertice superior derecho del pentagrama.



Lo siguiente que hago es crear una geometria para localizar la interseccion de las dos rectas que acabo de localizar y, a continuacion, establezco ese punto como punto de referencia.



Con esto que he hecho, ya me es bastante facil localizar el area donde se encuentran las notas del pentagrama.


Por ahora, no he conseguido localizar bien las notas. Por ejemplo, la nota blanca no la detecta y voy a tener que ponerme a "jugar" con los umbrales de deteccion. En cuanto tenga un rato, seguire con ello y a ver si logro avanzar. Creo que este paso me va a llevar un rato...