comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Funciones para marcar contornos de una imagen y marcar piel.

  • 2 Respuestas
  • 4061 Vistas

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 79137913

  • *
  • Moderator
  • Mensajes: 631
  • Actividad:
    6.67%
  • Reputación 11
  • 4 Esquinas
    • Ver Perfil
    • Doors.Party
    • Email
  • Skype: fg_mdq@hotmail.com
« en: Febrero 01, 2013, 08:17:40 pm »
HOLA!!!

Bueno, este es el primer codigo de la semana empiezo con algo complicado  que va a requerir mucho nivel del programador que lo lea, ya que estamos entrando en un tema de reconocimiento de imagenes, en este caso, ROSTROS.

En este post esta el codigo y el ejemplo de como pixel por pixel ir recorriendo una imagen y marcar todos los bordes mediante reconocimiento de diferencia de tonalidad y sombras, ademas, tambien hay otra funcion que reconoce los pixels que estan en el espectro de colores de la piel humana (de caucasico a hispano).

LO MAS IMPORTANTE:

No tengan miedo de preguntar como funciona, que lo que mas quiero es que aprendan.

Gracias a LEANDROA pude armar una funcion que convierte una imagen cualquiera a una imagen en ByN puro sin escala de grises marcando solamente los contornos de las cosas.

Hay una variable "Tolerance" esa la regulan para que sea mas o menos estricto con la deteccion de bordes.

Bueno aca el codigo (Modulo):
Código: Visual Basic
  1. Option Explicit
  2. Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hDC As Long, pBitmapInfo As BITMAPINFO24, ByVal un As Long, lplpVoid As Long, ByVal handle As Long, ByVal dw As Long) As Long
  3. Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
  4. Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
  5. Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As Long) As Long
  6. Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
  7. Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  8. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  9. Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
  10. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  11. Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
  12.  
  13. Private Type RGBQUAD
  14.     rgbBlue As Byte
  15.     rgbGreen As Byte
  16.     rgbRed As Byte
  17.     rgbReserved As Byte
  18. End Type
  19.  
  20. Private Type BITMAPINFOHEADER
  21.     biSize As Long
  22.     biWidth As Long
  23.     biHeight As Long
  24.     biPlanes As Integer
  25.     biBitCount As Integer
  26.     biCompression As Long
  27.     biSizeImage As Long
  28.     biXPelsPerMeter As Long
  29.     biYPelsPerMeter As Long
  30.     biClrUsed As Long
  31.     biClrImportant As Long
  32. End Type
  33.  
  34. Private Type BITMAPINFO24
  35.     bmiHeader As BITMAPINFOHEADER
  36.     bmiColors() As RGBQUAD
  37. End Type
  38.  
  39. Private Type SAFEARRAYBOUND
  40.     cElements As Long
  41.     lLbound As Long
  42. End Type
  43.  
  44. Private Type SAFEARRAY2D
  45.     cDims As Integer
  46.     fFeatures As Integer
  47.     cbElements As Long
  48.     cLocks As Long
  49.     pvData As Long
  50.     Bounds(0 To 1) As SAFEARRAYBOUND
  51. End Type
  52.  
  53.  
  54. Private Const DIB_RGB_COLORS = 0
  55. Private Const BI_RGB = 0&
  56.  
  57.  
  58. Public Sub BuscarContornos(Pic As PictureBox)
  59.     Dim BytesPerLine As Long
  60.     Dim WinDC As Long
  61.     Dim TmpDC As Long
  62.     Dim hBmp As Long
  63.     Dim OldBmp As Long
  64.     Dim Addrs As Long
  65.     Dim x As Long
  66.     Dim y As Long
  67.     Dim lpBits() As Byte
  68.     Dim M_BitmapInfo As BITMAPINFO24
  69.     Dim SA As SAFEARRAY2D
  70.     Dim R As Byte, G As Byte, B As Byte, BYN As Byte, Tolerance As Byte
  71.     Dim ZERO As Integer
  72.     Dim tmp1 As Integer, tmp2 As Integer, tmp3 As Integer
  73.     Tolerance = 20
  74.     ZERO = 0
  75.     BytesPerLine = ScanAlign(Pic.ScaleWidth * 3)
  76.  
  77.     With M_BitmapInfo.bmiHeader
  78.         .biSize = Len(M_BitmapInfo.bmiHeader)
  79.         .biWidth = Pic.ScaleWidth
  80.         .biHeight = Pic.ScaleHeight
  81.         .biPlanes = 1
  82.         .biBitCount = 24
  83.         .biCompression = BI_RGB
  84.         .biSizeImage = BytesPerLine * Pic.ScaleHeight
  85.     End With
  86.  
  87.     WinDC = GetDC(0)
  88.     TmpDC = CreateCompatibleDC(WinDC)
  89.     hBmp = CreateDIBSection(WinDC, M_BitmapInfo, DIB_RGB_COLORS, Addrs, 0, 0)
  90.  
  91.     Call ReleaseDC(0, WinDC)
  92.  
  93.     With SA
  94.         .cbElements = 1
  95.         .cDims = 2
  96.         .Bounds(0).lLbound = 0
  97.         .Bounds(0).cElements = Pic.ScaleHeight
  98.         .Bounds(1).lLbound = 0
  99.         .Bounds(1).cElements = BytesPerLine
  100.         .pvData = Addrs
  101.     End With
  102.  
  103.     CopyMemory ByVal VarPtrArray(lpBits), VarPtr(SA), 4
  104.  
  105.     OldBmp = SelectObject(TmpDC, hBmp)
  106.  
  107.     Call BitBlt(TmpDC, 0, 0, Pic.ScaleWidth, Pic.ScaleHeight, Pic.hDC, 0, 0, vbSrcCopy)
  108.  
  109.     For y = 0 To Pic.ScaleHeight - 1
  110.         For x = 0 To (Pic.ScaleWidth * 3) - 1 Step 3
  111.  
  112.             B = lpBits(x + 2, y)
  113.             G = lpBits(x + 1, y)
  114.             R = lpBits(x, y)
  115.  
  116.  
  117.             'ZERO ES PARA QUE NO HAGA DESBORDAMIENTO
  118.            BYN = Int((ZERO + R + G + B) / 3)
  119.            
  120.             'DIBUJA EN BLANCO Y NEGRO
  121.            
  122.             lpBits(x, y) = BYN
  123.             lpBits(x + 1, y) = BYN
  124.             lpBits(x + 2, y) = BYN
  125.             If x <> 0 And y <> 0 Then
  126.             tmp1 = lpBits(x - 1, y - 1)
  127.             tmp2 = lpBits(x - 1, y)
  128.             tmp3 = lpBits(x, y - 1)
  129.             If Abs(tmp2 - tmp1) > Tolerance Or Abs(tmp3 - tmp1) > Tolerance Then
  130.                 lpBits(x - 1, y - 1) = 0
  131.                 lpBits(x - 2, y - 1) = 0
  132.                 lpBits(x - 3, y - 1) = 0
  133.             Else
  134.                 'PINTA DE NEGRO EL PIXEL POR QUE AHI HAY UN BORDE
  135.                lpBits(x - 1, y - 1) = 255
  136.                 lpBits(x - 2, y - 1) = 255
  137.                 lpBits(x - 3, y - 1) = 255
  138.             End If
  139.             End If
  140.         Next x
  141.     Next y
  142.  
  143.     CopyMemory ByVal VarPtrArray(lpBits), 0&, 4
  144.     Call BitBlt(Pic.hDC, 0, 0, Pic.ScaleWidth, Pic.ScaleHeight, TmpDC, 0, 0, vbSrcCopy)
  145.     Call DeleteObject(SelectObject(TmpDC, OldBmp))
  146.     Call DeleteDC(TmpDC)
  147.  
  148.  
  149.  
  150. End Sub
  151.  
  152. Public Sub BuscarPiel(Pic As PictureBox)
  153.     Dim BytesPerLine As Long
  154.     Dim WinDC As Long
  155.     Dim TmpDC As Long
  156.     Dim hBmp As Long
  157.     Dim OldBmp As Long
  158.     Dim Addrs As Long
  159.     Dim x As Long
  160.     Dim y As Long
  161.     Dim lpBits() As Byte
  162.     Dim M_BitmapInfo As BITMAPINFO24
  163.     Dim SA As SAFEARRAY2D
  164.     Dim R As Byte, G As Byte, B As Byte, BYN As Byte, Tolerance As Byte
  165.     Dim ZERO As Integer
  166.     Dim tmp1 As Integer, tmp2 As Integer, tmp3 As Integer
  167.     Tolerance = 20
  168.     ZERO = 0
  169.     BytesPerLine = ScanAlign(Pic.ScaleWidth * 3)
  170.  
  171.     With M_BitmapInfo.bmiHeader
  172.         .biSize = Len(M_BitmapInfo.bmiHeader)
  173.         .biWidth = Pic.ScaleWidth
  174.         .biHeight = Pic.ScaleHeight
  175.         .biPlanes = 1
  176.         .biBitCount = 24
  177.         .biCompression = BI_RGB
  178.         .biSizeImage = BytesPerLine * Pic.ScaleHeight
  179.     End With
  180.  
  181.     WinDC = GetDC(0)
  182.     TmpDC = CreateCompatibleDC(WinDC)
  183.     hBmp = CreateDIBSection(WinDC, M_BitmapInfo, DIB_RGB_COLORS, Addrs, 0, 0)
  184.  
  185.     Call ReleaseDC(0, WinDC)
  186.  
  187.     With SA
  188.         .cbElements = 1
  189.         .cDims = 2
  190.         .Bounds(0).lLbound = 0
  191.         .Bounds(0).cElements = Pic.ScaleHeight
  192.         .Bounds(1).lLbound = 0
  193.         .Bounds(1).cElements = BytesPerLine
  194.         .pvData = Addrs
  195.     End With
  196.  
  197.     CopyMemory ByVal VarPtrArray(lpBits), VarPtr(SA), 4
  198.  
  199.     OldBmp = SelectObject(TmpDC, hBmp)
  200.  
  201.     Call BitBlt(TmpDC, 0, 0, Pic.ScaleWidth, Pic.ScaleHeight, Pic.hDC, 0, 0, vbSrcCopy)
  202.  
  203.     For y = 0 To Pic.ScaleHeight - 1
  204.         For x = 0 To (Pic.ScaleWidth * 3) - 1 Step 3
  205.  
  206.             R = lpBits(x + 2, y)
  207.             G = lpBits(x + 1, y)
  208.             B = lpBits(x, y)
  209.  
  210.  
  211.             'ZERO ES PARA QUE NO HAGA DESBORDAMIENTO
  212.            BYN = Int((ZERO + R + G + B) / 3)
  213.            
  214.             'DIBUJA EN BLANCO Y NEGRO
  215.            If R > 168 And G > 134 And B > 94 And R < 250 And G < 235 And B < 215 Then
  216.             ' LOS PROXIMOS 3 VALORES ESPECIFICAN EL COLOR CON EL QUE SE VA A PINTAR
  217.            lpBits(x, y) = 0
  218.             lpBits(x + 1, y) = 255
  219.             lpBits(x + 2, y) = 255
  220.             Else
  221.             lpBits(x, y) = 0 ' BYN
  222.            lpBits(x + 1, y) = 0 'BYN
  223.            lpBits(x + 2, y) = 0 'BYN
  224.            End If
  225.         Next x
  226.     Next y
  227.  
  228.     CopyMemory ByVal VarPtrArray(lpBits), 0&, 4
  229.     Call BitBlt(Pic.hDC, 0, 0, Pic.ScaleWidth, Pic.ScaleHeight, TmpDC, 0, 0, vbSrcCopy)
  230.     Call DeleteObject(SelectObject(TmpDC, OldBmp))
  231.     Call DeleteDC(TmpDC)
  232.  
  233.  
  234.  
  235. End Sub
  236.  
  237. Private Function ScanAlign(WidthBmp As Long) As Long
  238.     ScanAlign = (WidthBmp + 3) And &HFFFFFFFC
  239. End Function
  240.  
  241.  

Para llamar la funcion:
Código: Visual Basic
  1. Private Sub Command1_Click()
  2.     'ESTO PARA CONTORNOS
  3.    BuscarContornos PicTratamiento
  4.     'ESTO PARA PIEL
  5.    BuscarPiel PicTratamiento
  6.     PicTratamiento.Refresh
  7. End Sub
  8.  
  9. Private Sub Form_Load()
  10.     PicTratamiento.AutoRedraw = True
  11.     PicTratamiento.ScaleMode = vbPixels
  12. End Sub

P.D: El de la foto soy yo asi que no puteen.
GRACIAS POR LEER!!!
« Última modificación: Enero 14, 2015, 08:16:30 pm por Expermicid »
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scout Team*                                                   No tienes permisos para ver links. Registrate o Entra con tu cuenta

Desconectado F0M3T

  • *
  • Underc0der
  • Mensajes: 177
  • Actividad:
    1.67%
  • Reputación 0
  • Antes de empezar, mira el lienzo...
    • Ver Perfil
    • f0m3t blogsgsgsgsdfñsadf
« Respuesta #1 en: Agosto 06, 2013, 02:42:34 am »
Como funciona?, no entiendo, perdon, se que es algo antiguo el post, pero lo estaba viendo y me llamo la atencion :P
saludos numeritos

Esto no se trata de ganar, se trata de no perder.

Desconectado 79137913

  • *
  • Moderator
  • Mensajes: 631
  • Actividad:
    6.67%
  • Reputación 11
  • 4 Esquinas
    • Ver Perfil
    • Doors.Party
    • Email
  • Skype: fg_mdq@hotmail.com
« Respuesta #2 en: Agosto 06, 2013, 08:30:58 am »
HOLA!!!

Lo que hacen las funciones es lo siguiente:
Contorno:
Busca diferencia entre pixels con X tolerancia, si la diferencia es mayor a X marca en negro, sino en blanco.

BuscarPiel:
Busca las tonalidades estandares de piel, con X tolerancia, si los valores se encuentran en el ratio pinta de amarillo, sino de blanco.(no funciona con gente de la etnia "negra")

De esta manera luego solo nos queda identificar las zonas amarillas de las fotos y/o verificar las figuras formadas por los bordes negros.

GRACIAS POR LEER!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scout Team*                                                   No tienes permisos para ver links. Registrate o Entra con tu cuenta

 

¿Te gustó el post? COMPARTILO!



Voten para un VBClassic compatible con las ultimas tecnologias!

Iniciado por 79137913

Respuestas: 3
Vistas: 2510
Último mensaje Febrero 23, 2014, 04:35:49 pm
por alexander1712
[VB6] Funcion para subir Archivos FTP mediante Inet

Iniciado por 79137913

Respuestas: 0
Vistas: 544
Último mensaje Julio 11, 2018, 09:24:28 am
por 79137913
MZ-Tools 3.0 para Visual Basic

Iniciado por Expermicid

Respuestas: 0
Vistas: 2490
Último mensaje Junio 14, 2012, 12:29:56 pm
por Expermicid
Herramientas y utilidades para VB6

Iniciado por alexander1712

Respuestas: 0
Vistas: 3461
Último mensaje Enero 26, 2013, 03:00:34 am
por alexander1712
[vb6] Recopilacion de Funciones con operaciones Binarias.

Iniciado por alexander1712

Respuestas: 5
Vistas: 2469
Último mensaje Octubre 25, 2012, 05:29:03 pm
por alexander1712