Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: <[(x)]> en 20 Febrero 2010, 06:07 AM

Título: capture cam web
Publicado por: <[(x)]> en 20 Febrero 2010, 06:07 AM



hola quiero capturar imagenes de la camara web de mi notebook...

ya tengo un codigo pero usa la funcion sendmessage y hace pasar la imagenes capturadas por el clipboard.  :-\

les agradeceria mucho si me alcanzasen un codigo q no use este mismo metodo.
Título: Re: capture cam web
Publicado por: seba123neo en 21 Febrero 2010, 01:25 AM
probaste esto ?

Capturar la webCam  (http://www.recursosvisualbasic.com.ar/htm/listado-api/222-capturar-webcam-con-sendmessage-capCreateCaptureWindow.htm)

Título: Re: capture cam web
Publicado por: <[(x)]> en 21 Febrero 2010, 18:18 PM
 :o

busque un monton no puedo creer q me haya olvidado de esa pagina  :P


el primero esta incompleto y es como decia yo pero el segundo esta perfecto muchas gracias ;-)
Título: Re: capture cam web
Publicado por: <[(x)]> en 21 Febrero 2010, 19:13 PM
unm seba123neo problemaa :P


cundo quiero:
Código (vb) [Seleccionar]
Private Sub Timer1_Timer()
Dim x As Integer
Dim y As Integer
For x = 0 To 480 / 10
For y = 0 To 640 / 10
 Me.BackColor = GetPixel(Picture1.hdc, x, y)
Next
Next
End Sub


el color que saca getpixel es siempre el background del dc delpicture
Título: Re: capture cam web
Publicado por: seba123neo en 21 Febrero 2010, 19:15 PM
que queres hacer?
Título: Re: capture cam web
Publicado por: <[(x)]> en 21 Febrero 2010, 19:17 PM
 mmm es complejo ya se como lo voi a hacer nose si se tildara mucho desp lo paso a c++...

en fin lo que quiero es poder por ejemplo encontrar un punto de tal color en la imagen y ver donde esta (x,y) y con eso pordria hacer muchas cositas  :P como identificar formas...
pero bue
primero lo primero no? je


poriams decirme como puedo hacer?
Título: Re: capture cam web
Publicado por: seba123neo en 21 Febrero 2010, 20:13 PM
proba algo asi:

Código (vb) [Seleccionar]
Option Explicit

Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long

Private Sub Command1_Click()

    Dim vEscalaForm As Integer, vPicEscala As Integer
    Dim X As Long, Y As Long, vAlto As Long, vAncho As Long
   
    vEscalaForm = Me.ScaleMode
    vPicEscala = Picture1.ScaleMode
   
    Me.ScaleMode = 3
    Picture1.ScaleMode = 3
   
    vAncho = Picture1.width
    vAlto = Picture1.height
   
    Me.Cls
   
    For X = 0 To vAncho
        For Y = 0 To vAlto
            If Picture1.Point(X, Y) = 6522062 Then
                SetPixelV Me.hdc, X, Y, GetPixel(Picture1.hdc, X, Y)
            End If
            DoEvents
        Next
        DoEvents
    Next
   
    Me.ScaleMode = vEscalaForm
    Picture1.ScaleMode = vPicEscala
End Sub

Private Sub Form_Load()
    With Picture1
        .AutoSize = True
        .Picture = LoadPicture(Environ("windir") & "\Santa Fe.bmp")
    End With
End Sub


esto hace como un escaneo de los pixeles de la imagen y va sacando el color de ese pixel escaneado, con un simple if podes sacar los colores que te interesen y volcarlos en otro lado, por ejemplo aca se saca un determinado color y vuelca "solo ese color" en el formulario...

saludos. 
Título: Re: capture cam web
Publicado por: <[(x)]> en 21 Febrero 2010, 22:30 PM


jojo muy bueno  :P... solo q ese codigo es el q estoy probando y no me saca el color del pixel..

probe con picture.point(x,y), getpixel recorriendo la imagen con el for anidado y no hace mas q darme en todos los pixeles un mismo color el de  backgound  :-\.


te dejo lo que copypaste hasta ahora   :silbar:
form1
Código (vb) [Seleccionar]
Option Explicit
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Dim temp As Long

' botón que inicia la captura
'''''''''''''''''''''''''''''''''''''''
Private Sub Command1_Click()
Dim temp As Long

  hwdc = capCreateCaptureWindow("CapWindow", ws_child Or ws_visible, _
                                    0, 0, 320, 240, Picture1.hwnd, 0)
  If (hwdc <> 0) Then
    temp = SendMessage(hwdc, wm_cap_driver_connect, 0, 0)
    temp = SendMessage(hwdc, wm_cap_set_preview, 1, 0)
    temp = SendMessage(hwdc, WM_CAP_SET_PREVIEWRATE, 30, 0)
    temp = SendMessage(hwdc, WM_CAP_SET_SCALE, True, 0)
    'esto hace que la imagen recibida por el dispositivo se ajuste
    'al tamaño de la ventana de captura (justo lo que yo buscaba)
    DoEvents
    startcap = True
    Else
    MsgBox "No hay Camara Web", 48, "Error"
  End If

End Sub

' botón para detener la captura
'''''''''''''''''''''''''''''''''''''''
Private Sub Command2_Click()
   
    temp = DestroyWindow(hwdc)
    If startcap = True Then
        temp = SendMessage(hwdc, WM_CAP_DRIVER_DISCONNECT, 0&, 0&)
        DoEvents
        startcap = False
    End If

End Sub

' Botón que abre el dialogo de formato
''''''''''''''''''''''''''''''''''''''''''''
Private Sub Command3_Click()
        If startcap = True Then
           
            temp = SendMessage(hwdc, WM_CAP_DLG_VIDEOFORMAT, 0&, 0&)
            DoEvents
        End If
End Sub
' Mostrar dialogo de Configuracion de la WebCam
''''''''''''''''''''''''''''''''''''''''''''''''''''
Private Sub Command4_Click()
Dim temp As Long
    If startcap = True Then
        temp = SendMessage(hwdc, WM_CAP_DLG_VIDEOCONFIG, 0&, 0&)
        DoEvents
    End If
End Sub

Private Sub Form_Load()
    Command1.Caption = "Iniciar"
    Command2.Caption = "Detener"
    Command3.Caption = "Formato"
    Command4.Caption = "Configurar"
    Me.Caption = "Capturador de Web Cam"
End Sub

Private Sub Form_Resize()
    On Error Resume Next
    Move (Screen.Width - Width) \ 29, (Screen.Height - Height) \ 29
End Sub

Private Sub Form_Unload(Cancel As Integer)

    temp = DestroyWindow(hwdc)
    If startcap = True Then
        temp = SendMessage(hwdc, WM_CAP_DRIVER_DISCONNECT, 0&, 0&)
        DoEvents
        startcap = False
    End If
End Sub



Private Sub Timer1_Timer()
Dim x As Integer
Dim y As Integer
For x = 0 To 480 / 10
For y = 0 To 640 / 10
  Me.BackColor = Picture1.Point(x, y)
Next
Next
End Sub


modulo
Código (vb) [Seleccionar]
Option Explicit
' declaraciones Api, constantes, variables
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Const ws_child = &H40000000
Public Const ws_visible = &H10000000
Public Const WM_USER = 1024
Public Const wm_cap_driver_connect = WM_USER + 10
Public Const wm_cap_set_preview = WM_USER + 50
Public Const WM_CAP_SET_PREVIEWRATE = WM_USER + 52
Public Const WM_CAP_DRIVER_DISCONNECT = WM_USER + 11
Public Const WM_CAP_DLG_VIDEOFORMAT = WM_USER + 41
Public Const WM_CAP_DLG_VIDEOCONFIG = WM_USER + 42
Public Const WM_CAP_SET_SCALE = WM_USER + 53

'Api para crear la ventana de captura
Public Declare Function capCreateCaptureWindow Lib "avicap32.dll" _
    Alias "capCreateCaptureWindowA" ( _
    ByVal lpszWindowName As String, _
    ByVal dwStyle As Long, _
    ByVal x As Long, _
    ByVal y As Long, _
    ByVal nWidth As Long, _
    ByVal nHeight As Long, _
    ByVal hwndParent As Long, _
    ByVal nID As Long) As Long

Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any) As Long

Public Declare Function DestroyWindow Lib "user32" (ByVal hndw As Long) As Boolean
'Solo 16 Bits (vb2, vb3 y vb4  de 16)
'Declare Function SendMessage Lib "User" ( _
    ByVal hWnd As Integer, _
    ByVal wMsg As Integer, _
    ByVal wParam As Integer, _
    lParam As Any) As Long
'Api para crear la ventana de captura
'Declare Function capCreateCaptureWindow Lib "avicap.dll" ( _
    ByVal lpszWindowName As String, _
    ByVal dwStyle As Long, _
    ByVal x As Integer, _
    ByVal y As Integer, _
    ByVal nWidth As Integer, _
    ByVal nHeight As Integer, _
    ByVal hwndParent As Integer, _
    ByVal nID As Integer) As Long
'Declare Function DestroyWindow Lib "User" (ByVal hndw As Integer) As Integer
Public hwdc As Long
Public startcap As Integer





Título: Re: capture cam web
Publicado por: el_c0c0 en 22 Febrero 2010, 02:44 AM
sabes lo que pasa, intenta hacer bitblt al picture donde tenes la captura y pintarlo en otro picture, fijate que te va a quedar negro o del color de fondo del picture de la captura. tenes que usar otro metodo, donde puedas obtener la imagen.

nose si me entendiste, pero con eso, por lo menos yo, no podia obtener la foto de la webcam, era imposible. habia que buscar otro metodo como el del clipobard o otro que habia hecho cobein (que no recuerdo si usaba el clipboard)

saludos
Título: Re: capture cam web
Publicado por: <[(x)]> en 22 Febrero 2010, 04:07 AM



jeje se coco eso es lo que quiero .. si alguien conoce un metodo q funcione y nouse el clipboard ;-)
Título: Re: capture cam web
Publicado por: LeandroA en 22 Febrero 2010, 04:09 AM
yo uso esto no es lo mejor porque guarda la imagen en un archivo y depues la lee nuevamente, pero es mejor que el portapapeles.

Código (vb) [Seleccionar]
Private Const GET_FRAME As Long = 1084
Private Const WM_USER = &H400
Private Const WM_CAP_START = WM_USER
Private Const WM_CAP_FILE_SAVEDIB = WM_CAP_START + 25


Código (vb) [Seleccionar]
Public Function GetFrameWebCam() As StdPicture
    On Error Resume Next
    Dim Nombre As String
    If mCapHwnd <> 0 Then
        Nombre = StrConv(App.Path & "\TMPfoto.bmp", vbFromUnicode)
        SendMessage mCapHwnd, GET_FRAME, ByVal 0, ByVal 0
        SendMessage mCapHwnd, WM_CAP_FILE_SAVEDIB, 0, StrPtr(Nombre)
        Set GetFrameWebCam = LoadPicture(App.Path & "\TMPfoto.bmp")
        Kill App.Path & "\TMPfoto.bmp"
    End If
End Function


despues para la rutina de analizar la imagen utilizo esto metodo que es mucho mas rapido que usar getpixel

Código (vb) [Seleccionar]
Option Explicit
Private Declare Function OleTranslateColor Lib "OLEPRO32.DLL" (ByVal OLE_COLOR As Long, ByVal HPALETTE As Long, pccolorref As Long) As Long
Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Type SAFEARRAYBOUND
    cElements           As Long
    lLbound             As Long
End Type

Private Type SAFEARRAY2D
    cDims               As Integer
    fFeatures           As Integer
    cbElements          As Long
    cLocks              As Long
    pvData              As Long
    Bounds(0 To 1)      As SAFEARRAYBOUND
End Type

Private Type BITMAP
  bmType                As Long
  bmWidth               As Long
  bmHeight              As Long
  bmWidthBytes          As Long
  bmPlanes              As Integer
  bmBitsPixel           As Integer
  bmBits                As Long
End Type


Public Sub AnalizeCapture(ByVal hBmp As StdPicture)

    Dim bDib()          As Byte
    Dim X As Long, Y    As Long
    Dim xEnd            As Long
    Dim SA              As SAFEARRAY2D
    Dim tBmp            As BITMAP
    Dim R As Byte, G As Byte, B As Byte
   
    GetObjectAPI hBmp, Len(tBmp), tBmp
     
    With SA
        .cbElements = 1
        .cDims = 2
        .Bounds(0).lLbound = 0
        .Bounds(0).cElements = tBmp.bmHeight
        .Bounds(1).lLbound = 0
        .Bounds(1).cElements = tBmp.bmWidthBytes
        .pvData = tBmp.bmBits
    End With
   
    CopyMemory ByVal VarPtrArray(bDib), VarPtr(SA), 4

    xEnd = (tBmp.bmWidth - 1) * 3
   
    For Y = 0 To tBmp.bmHeight - 1
        For X = 0 To xEnd Step 3
            B = CLng(bDib(X, Y))
            G = CLng(bDib(X + 1, Y))
            R = CLng(bDib(X + 2, Y))
           
            'Debug.Print r,g,b
        Next
    Next
             
    CopyMemory ByVal VarPtrArray(bDib), 0&, 4

End Sub



osea tendrias que llamar todo asi

call AnalizeCapture(GetFrameWebCam)

y bueno despues vos hace el resto.
Título: Re: capture cam web
Publicado por: <[(x)]> en 22 Febrero 2010, 04:14 AM

hola  LeandroA voy a probar en una de esas locas casualidades va..jaja


el codigo que hice es para detectar una forma y ver como se mueve con la camara tendria q ser muy rapido.. si alguien tiene algomas directo gracias!