• Viernes 8 de Noviembre de 2024, 19:12

Autor Tema:  Procesar frames con AVICap  (Leído 1954 veces)

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Procesar frames con AVICap
« en: Martes 24 de Marzo de 2009, 07:53 »
0
Qué tal amigos, estoy realizando una aplicación de procesamiento de video, para ello estoy utilizando AVICap. De hecho, ya he realizado lo que intento hacer, con C (sin AVICap) y con VB.NET, sin embargo, por motivos didáctivos me han pedido lo implemente también en VB 6 :p.

El problema es que de VB no conozco demasiado, y tengo problemas para poder configurar la función "callback" que se ejecutará al momento de que la cámara se actualiza con el siguiente frame. En VB.NET lo estoy haciendo así (lo tomé de otro código que encontré):

Módulo:
Código: Visual Basic
  1.     Delegate Function CallBackDelegate(ByVal hwnd As IntPtr, ByRef lpVhdr As VIDEOHDR) As IntPtr
  2.     Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As CallBackDelegate) As IntPtr
  3.  
  4.     Public Structure VIDEOHDR
  5.         Dim lpData As Integer '// address of video buffer
  6.         Dim dwBufferLength As Integer '// size, in bytes, of the Data buffer
  7.         Dim dwBytesUsed As Integer '// see below
  8.         Dim dwTimeCaptured As Integer '// see below
  9.         Dim dwUser As Integer '// user-specific data
  10.         Dim dwFlags As Integer '// see below
  11.         <VBFixedArray(3)> Dim dwReserved() As Integer '// reserved; do notuse}
  12.     End Structure
  13.  

Clase del form principal:
Código: Visual Basic
  1. Public Class frmCaptura
  2.     Dim hwdc As Integer
  3.     Dim conectado As Boolean
  4.     Dim g As Graphics
  5.     Private delCallBack As CallBackDelegate = New CallBackDelegate(AddressOf procesaFrame)
  6.  
  7.  
  8.     Private Sub btnIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIniciar.Click
  9.         Dim res As Integer
  10.  
  11.         hwdc = capCreateCaptureWindow("Captura Cámara", WS_CHILD Or WS_VISIBLE, 0, 0, 320, 240, picCaptura.Handle.ToInt32, 0)
  12.         If (hwdc <> 0) Then
  13.             res = SendMessage(hwdc, WM_CAP_DRIVER_CONNECT, 0, 0)
  14.             res = SendMessage(hwdc, WM_CAP_SET_PREVIEW, 1, 0)
  15.             res = SendMessage(hwdc, WM_CAP_SET_PREVIEWRATE, 60, 0)
  16.             conectado = True
  17.             ' Configura callback
  18.             res = SendMessage(hwdc, WM_CAP_SET_CALLBACK_FRAME, New IntPtr(0), delCallBack)
  19.         Else
  20.             MsgBox("No se encontró dispositivo de captura")
  21.         End If
  22.  
  23.     End Sub
  24. ...
  25.  
  26.     Private Function procesaFrame(ByVal hwnd As IntPtr, ByRef lpVHdr As VIDEOHDR) As IntPtr
  27.     ...
  28.     End Function
  29.  
  30.  

¿Alguien sabría cómo hacerlo en VB 6? De hecho, ya tengo un avance, pero me gustaría saber si alguien ya lo ha hecho y que pudiera echarme una mano :). Por el momento ya los estoy convenciendo de trabajar con .NET (con VB o C#, que lo manejo mejor), ya que con C/C++ por el momento nop (este si lo domino :p).

Gracias.
La imaginación es el límite.
Hardware & Software | Mexchip

Geo

  • Miembro de PLATA
  • *****
  • Mensajes: 1011
  • Nacionalidad: mx
    • Ver Perfil
    • http://hsblog.mexchip.com
Re: Procesar frames con AVICap
« Respuesta #1 en: Viernes 27 de Marzo de 2009, 07:00 »
0
Ya lo conseguí, aunque ahora tengo problemas con el manejo de memoria dentro de la función callback, a ver si puedo con esto :).
La imaginación es el límite.
Hardware & Software | Mexchip