2011-02-22 16 views
5

Estoy tratando de encontrar la forma de obtener el reconocimiento de imagen de Sikuli para usar dentro de C#. No quiero usar Sikuli porque su lenguaje de scripting es un poco lento, y porque realmente no quiero introducir un puente java en el medio de mi aplicación .NET C#.Reconocimiento de región de pantalla para buscar la ubicación del campo en la pantalla

Entonces, tengo un mapa de bits que representa un área de mi pantalla (llamaré a esta región BUTTON1). Es posible que el diseño de la pantalla haya cambiado ligeramente o que la pantalla se haya movido en el escritorio, por lo que no puedo usar una posición directa. Tengo que encontrar primero donde actual posición de BUTTON1 está dentro de la pantalla en vivo. (Traté de publicar imágenes de esto, pero creo que no puedo porque soy un nuevo usuario ... Espero que la descripción lo aclare ...)

Creo que Sikuli está usando OpenCV bajo las sábanas . Como es de código abierto, creo que podría realizar una ingeniería inversa, y averiguar cómo hacer lo que están haciendo en OpenCV, implementándolo en Emgu.CV, pero mi Java no es muy sólida.

He buscado ejemplos que muestren esto, pero todos los ejemplos son extremadamente sencillos (es decir, cómo reconocer una señal de stop) o muy complejos (es decir, cómo hacer reconocimiento facial) ... y tal vez solo soy denso , pero parece que no puedo dar el salto en la lógica de cómo hacer esto.

También me preocupa que todas las rutinas de manipulación de imágenes sean realmente intensivas en el procesador, y realmente quiero que sea lo más ligero posible (en realidad podría tener muchos botones y campos que estoy tratando de encontrar en una pantalla ... .)

Por lo tanto, la forma en que estoy pensando en hacer esto en su lugar es:

a) convertir los mapas de bits a las matrices de bytes y hacer búsqueda de fuerza bruta. (Sé cómo hacer esa parte). Y luego

B) Use la posición del arreglo de bytes que encontré para calcular su posición de pantalla (realmente no estoy completamente seguro de cómo hago esto) en lugar de usar el procesamiento de imágenes.

¿Está completamente loco? ¿Alguien tiene un ejemplo simple de cómo se podría usar Aforge.Net o Emgu.CV para hacer esto? (¿O cómo desarrollar el paso B de arriba ...?)

¡Gracias!

+0

+1 Pregunta impresionante: ¡Espero que alguien nos presente una buena respuesta! – Charles

Respuesta

0

En general, parece que desea el reconocimiento básico de objetos. No tengo ninguna experiencia con SIKULI, pero hay varias maneras de hacer reconocimiento de objetos (coincidencia de plantilla basada en el borde, etc.). Una vez dicho esto, es posible que puedas ir con el emparejamiento directo del histograma.

http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab.aspx

Esa página le mostrará cómo utilizar AForge.net para obtener el histograma de una imagen. Usted acaba de hacer una búsqueda de fuerza bruta usando algo como esto:

Bitmap ImageSearchingWithin=new Bitmap("Location of image"); //or just load from a screenshot or whatever 
for (int x = 0; x < ImageSearchingWithin.Width - WidthOfImageSearchingFor; ++x) 
{ 
    for (int y = 0; y < ImageSearchingWithin.Height - HeightOfImageSearchingFor; ++y) 
    { 
     Bitmap MySmallViewOfImage = ImageSearchingWithin.Clone(new Rectangle(x, y, WidthOfImageSearchingFor, HeightOfImageSearchingFor), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
    } 
} 

Y luego comparar histograma del mapa de bits de nueva creación a la que se ha calculado de la imagen original (cualquier área es el más cercano en términos de juego es lo seleccionarías como la región de BUTTON1). No es la solución más elegante, pero podría funcionar para sus necesidades. De lo contrario, entrarás en técnicas más difíciles (por supuesto, podría estar olvidando algo en el momento que podría ser más simple).

+0

Voy a aceptar esta respuesta, solo porque no vi nada más de valor.Para ser sincero, abandoné esto cuando descubrí que la biblioteca de OCR debajo de Sikuli tiene algunos problemas de pérdida de memoria. El histograma sería el camino a seguir, pero queda mucho trabajo por hacer desde aquí ... – MarkJoel60

Cuestiones relacionadas