Hola ^^ me gustaría hacer un programa que detecte una imagen en la pantalla y obtener las coordenadas x e y pero no sé como compararlas y obtener las coordenadas. Una ayudita? xD
« Última modificación: 1 Febrero 2015, 20:07 pm por Eleкtro »
¿Donde está el código que demuestra tus progresos?, en este lugar no hacemos trabajos, ayudamos a resolver dudas específicas o aportamos orientación.
Hay varias librerías, algunas gratis y otras de pago, que ofrecen algoritmos profesionales de técnicas ImageSearch o PixelSearch, como por ejemplo AForge.Net http://www.aforgenet.com/framework/downloads.html
Si quieres desarrollar tu propio algoritmo de forma tradicional no te lo recomiendo, por el simple hecho de que jamás podrás optimizarlo hasta tal punto, pero de todas formas puedes ver un ejemplo escrito en VB.Net en la class PixelUtil que desarrollé: Librería de Snippets !! (Compartan aquí sus snippets)
Este ejemplo utilizando Aforge, es una función de uso genérico que busca una imagen en otra imagen, y devuelve un objeto con las coordenadas y otra información relevante:
VB.Net:
Código
' Find Image
' ( By Elektro )
'
' Usage Examples:
'
'Private Sub Test() Handles MyBase.Shown
'
' ' A Desktop Screenshot, in 1920x1080 px. resolution.
' Dim desktopScreenshoot As New Bitmap("C:\Desktop.png")
'
' ' A cutted piece of the screenshot, in 50x50 px. resolution.
' Dim partOfDesktopToFind As New Bitmap("C:\PartOfDesktop.png")
'
' ' Find the part of the image in the desktop, with the specified similarity.
' For Each matching As AForge.Imaging.TemplateMatch In
1) El título de un tema debe describir el problema. Porfavor, lee las normas del subforo de programación.
¿Donde está el código que demuestra tus progresos?, en este lugar no hacemos trabajos, ayudamos a resolver dudas específicas o aportamos orientación.
Hay varias librerías, algunas gratis y otras de pago, que ofrecen algoritmos profesionales de técnicas ImageSearch o PixelSearch, como por ejemplo AForge.Net http://www.aforgenet.com/framework/downloads.html
Si quieres desarrollar tu propio algoritmo de forma tradicional no te lo recomiendo, por el simple hecho de que jamás podrás optimizarlo hasta tal punto, pero de todas formas puedes ver un ejemplo escrito en VB.Net en la class PixelUtil que desarrollé: Librería de Snippets !! (Compartan aquí sus snippets)
Este ejemplo utilizando Aforge, es una función de uso genérico que busca una imagen en otra imagen, y devuelve un objeto con las coordenadas y otra información relevante:
VB.Net:
Código
' Find Image
' ( By Elektro )
'
' Usage Examples:
'
'Private Sub Test() Handles MyBase.Shown
'
' ' A Desktop Screenshot, in 1920x1080 px. resolution.
' Dim desktopScreenshoot As New Bitmap("C:\Desktop.png")
'
' ' A cutted piece of the screenshot, in 50x50 px. resolution.
' Dim partOfDesktopToFind As New Bitmap("C:\PartOfDesktop.png")
'
' ' Find the part of the image in the desktop, with the specified similarity.
' For Each matching As AForge.Imaging.TemplateMatch In
pero la idea que me has dado serviría para buscarlo por toda la pantalla?
Hombre, por supuesto, solo debes obtener la imagen de la zona donde quieras buscar (puede ser una captura de la pantalla completa, claro), y si la imagen es demasiado grande redimensionar la imagen a unas dimensiones que te permitan realizar la búsqueda y comparación de imagen de una forma eficiente, rápida, pero sin aumentar el margen de falsos positivos, buscando esa relación (ej: 100x100 píxeles quizás, depende).
EDITO: No me ha quedado claro que camino vas a tomar para llevarlo a cabo, pero bueno vuelvo a aconsejarte utilizar la librería de AForge.Net, aunque he visto algoritmos de pago mucho más rápidos que obtienen los mismos o mejores resultados, pero AForge es excelente para ser gratis.
Realizar un algoritmo de ese estilo es relativamente fácil, de forma básica, pero es un tema muy delicado ya que procesar/comparar una imagen, una imagen que sea grande, es una operación muy lenta (y si usas metodologías anticuadas lo es aun mucho más), si no optimizas tu propio algoritmo hasta el punto que puede llegar a optimizarlo un grupo de desarrolladores profesionales en el tema que están vendiendo un producto de ese estilo entonces te puede quedar un algoritmo muy lento o incompetente en otros sentidos, y yo no soy ningún gurú en la optimización de este tema, pero llegué a implementar funcionalidades GPU para aumentar la velocidad de procesamiento de imagen y aun así no me convenció mucho el resultado que obtuve, sigo prefiriendo la estabilidad de AForge.
Saludos
« Última modificación: 2 Febrero 2015, 20:46 pm por Eleкtro »
No te preocupes, aquí nadie es mejor que nadie y todos vienen a aprender. Hombre, por supuesto, solo debes obtener la imagen de la zona donde quieras buscar (puede ser una captura de la pantalla completa, claro), y si la imagen es demasiado grande redimensionar la imagen a unas dimensiones que te permitan realizar la búsqueda y comparación de imagen de una forma eficiente, rápida, pero sin aumentar el margen de falsos positivos, buscando esa relación (ej: 100x100 píxeles quizás, depende).
EDITO: No me ha quedado claro que camino vas a tomar para llevarlo a cabo, pero bueno vuelvo a aconsejarte utilizar la librería de AForge.Net, aunque he visto algoritmos de pago mucho más rápidos que obtienen los mismos o mejores resultados, pero AForge es excelente para ser gratis.
Realizar un algoritmo de ese estilo es relativamente fácil, de forma básica, pero es un tema muy delicado ya que procesar/comparar una imagen, una imagen que sea grande, es una operación muy lenta (y si usas metodologías anticuadas lo es aun mucho más), si no optimizas tu propio algoritmo hasta el punto que puede llegar a optimizarlo un grupo de desarrolladores profesionales en el tema que están vendiendo un producto de ese estilo entonces te puede quedar un algoritmo muy lento o incompetente en otros sentidos, y yo no soy ningún gurú en la optimización de este tema, pero llegué a implementar funcionalidades GPU para aumentar la velocidad de procesamiento de imagen y aun así no me convenció mucho el resultado que obtuve, sigo prefiriendo la estabilidad de AForge.
Saludos
ahora le hecho un vistazo ^^,y bueno no te dije lo que quería cambiar,a sí que te lo dejo ahora , estoy usando una lista de coordenadas. a.MouseClick("Left", X, Y, 1, 1); y bueno,resulta que donde quiero pulsar aparece de forma aleatoria en la pantalla,por lo que rara vez clicaba,y por eso necesitaba lo de las imágenes ^^
Porfavor, cuando formules una pregunta sobre un error expecífico, asegúrate de MOSTRAR el mensaje de la excepción.
Muestra la información necesaria para intentar ayudarte, ese método tiene muchos overloads y puede dar muchos errores distintos, que podrías solucioanrlo viendo la documentación oficial.
De todas formas me imagino que estás teniendo una excepción del tipo UnsuportedImageFormatException, ya que para el objeto template estás utilizando el constructor del Bitmap que por defecto asigna un canal ARGB de 32bpp, y aparte de eso estas asignando manualmente en el otro bitmap el mismo canal y profundidad de bits, y ese tipo de formato no está soportado por el método en cuestión, simplemente usa el formato de pixel a Format24bppRgb.
Saludos
« Última modificación: 7 Febrero 2015, 16:08 pm por Eleкtro »
Yo una vez hice (copie en parte) un algoritmo ImageSearch bastante eficiente como para una imagen 1024 x 768. El algoritmo se basa en ir pixel por pixel comparando el primer pixel de la imagen X (imagen a buscar) con los pixeles de la imagen B (imagen base). Por primera vez yo lo había hecho con GetPixel (funcion de la libreria grafica de C#) pero era muy lento. Buscando en internet encontré que a través de punteros podes acceder directamente a la memoria donde se encuentran almacenados cada pixel, haciendo que la velocidad aumente considerablemente.
Nunca probé AForge pero el metodo que yo te digo lo podes comprobar acá:
Quizas te parezca algo lento pero eso se debe a que la imagen la obtiene de un WebBrowser, si la sacas de algún archivo estático y comparás, va a ser muy veloz.
Obviamente se podria optimizar mucho mas, haciendo por ejemplo, lo que dice Elektro, dividir en partes de 100x100.
Porfavor, cuando formules una pregunta sobre un error expecífico, asegúrate de MOSTRAR el mensaje de la excepción.
Muestra la información necesaria para intentar ayudarte, ese método tiene muchos overloads y puede dar muchos errores distintos, que podrías solucioanrlo viendo la documentación oficial.
De todas formas me imagino que estás teniendo una excepción del tipo UnsuportedImageFormatException, ya que para el objeto template estás utilizando el constructor del Bitmap que por defecto asigna un canal ARGB de 32bpp, y aparte de eso estas asignando manualmente en el otro bitmap el mismo canal y profundidad de bits, y ese tipo de formato no está soportado por el método en cuestión, simplemente usa el formato de pixel a Format24bppRgb.
Saludos
Me da esta exepción: 'AForge.Imaging.UnsupportedImageFormatException' en AForge.Imaging.dll
Información adicional: Unsupported pixel format of the source or template image.