Hace un tiempo estuve indagando acerca de como narices implementar un (decente) algoritmo de ImageMatching, esto significa, identificar la existencia de una imagen en la pantalla, y de paso obtener las coordenadas para futuros usos.
Pues bien, despues de mucho investigar y mucha documentación leida, está claro que un algoritmo casero no puede llegar a compararse en eficacia y rendimiento a un producto (una librería) de renombre que tenga la suficiente experiencia en el ámbito, pues esto no es un simple PixelSearch, es algo mucho más laborioso.
Después de probar en profundidad distintos productos/librerías, encontré Aforge.NET, el cual es muy bueno tanto en su capacidad efectiva como en su velocidad de procesamiento de imagen, aunque no resulta tan rápido como a mi me gustaria y como he visto en algún que otro Software.
Nota: Si alguien conoce alguna librería eficiente y más rápida que Aforge, le agradecería que lo comentase.
Este código necesita la utilización de dicha librería, AForge, y sirve para identificar una imagen en la pantalla y obtener sus coordenadas, algo imprescindible si tienes pensado desarrollar un Bot por reconocimiento de imagen... así que espero que le sirva a alguien de ayuda.
Unos consejos antes de utilizar:
1. Si la imagen es demasiado grande, redimensionala al 40-60% (cuidado, cuando más difuso estén los pixeles puede ser menos efectivo).
2. Si la velocidad no es la esperada, prueba también a convertir la imagen a una escala de grises.
Pues bien, despues de mucho investigar y mucha documentación leida, está claro que un algoritmo casero no puede llegar a compararse en eficacia y rendimiento a un producto (una librería) de renombre que tenga la suficiente experiencia en el ámbito, pues esto no es un simple PixelSearch, es algo mucho más laborioso.
Después de probar en profundidad distintos productos/librerías, encontré Aforge.NET, el cual es muy bueno tanto en su capacidad efectiva como en su velocidad de procesamiento de imagen, aunque no resulta tan rápido como a mi me gustaria y como he visto en algún que otro Software.
Nota: Si alguien conoce alguna librería eficiente y más rápida que Aforge, le agradecería que lo comentase.
Este código necesita la utilización de dicha librería, AForge, y sirve para identificar una imagen en la pantalla y obtener sus coordenadas, algo imprescindible si tienes pensado desarrollar un Bot por reconocimiento de imagen... así que espero que le sirva a alguien de ayuda.
Unos consejos antes de utilizar:
1. Si la imagen es demasiado grande, redimensionala al 40-60% (cuidado, cuando más difuso estén los pixeles puede ser menos efectivo).
2. Si la velocidad no es la esperada, prueba también a convertir la imagen a una escala de grises.
Código (vbnet) [Seleccionar]
' 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
' FindImage(BaseImage:=DesktopScreenshoot, ImageToFind:=PartOfDesktopToFind, Similarity:=80.5R) ' 80,5% Similarity.
'
' Dim sb As New System.Text.StringBuilder
'
' sb.AppendFormat("Top-Left Corner Coordinates: {0}", matching.Rectangle.Location.ToString())
' sb.AppendLine()
' sb.AppendFormat("Similarity Image Percentage: {0}%", (matching.Similarity * 100.0F).ToString("00.00"))
'
' MessageBox.Show(sb.ToString)
'
' Next matching
'
'End Sub
'
''' <summary>
''' Finds a part of an image inside other image and returns the top-left corner coordinates and it's similarity percent.
''' </summary>
''' <param name="BaseImage">
''' Indicates the base image.
''' </param>
''' <param name="ImageToFind">
''' Indicates the image to find in the base image.
''' </param>
''' <param name="Similarity">
''' Indicates the similarity percentage to compare the images.
''' A value of '100' means identical image.
''' Note: High percentage values with big images could take several minutes to finish.
''' </param>
''' <returns>AForge.Imaging.TemplateMatch().</returns>
Private Function FindImage(ByVal BaseImage As Bitmap,
ByVal ImageToFind As Bitmap,
ByVal Similarity As Double) As AForge.Imaging.TemplateMatch()
Dim SingleSimilarity As Single
' Translate the readable similarity percent value to Single value.
Select Case Similarity
Case Is < 0.1R, Is > 100.0R ' Value is out of range.
Throw New Exception(String.Format("Similarity value of '{0}' is out of range, range is from '0.1' to '100.0'",
CStr(Similarity)))
Case Is = 100.0R ' Identical image comparission.
SingleSimilarity = 1.0F
Case Else ' Image comparission with specific similarity.
SingleSimilarity = Convert.ToSingle(Similarity) / 100.0F
End Select
' Set the similarity threshold to find all matching images with specified similarity.
Dim tm As New AForge.Imaging.ExhaustiveTemplateMatching(SingleSimilarity)
' Return all the found matching images,
' it contains the top-left corner coordinates of each one
' and matchings are sortered by it's similarity percent.
Return tm.ProcessImage(BaseImage, ImageToFind)
End Function