Webcam con Delphi (I)

A continuación os presento el software que os permitirá manejar vuestra Webcam con Delphi.

Primeramente tenéis que instalar en vuestro sistema el software "Microsoft Video for Windows SDK " que contiene la librería Avicap32.dll.
Dentro de las funciones que contiene utilizaremos "capCreateCaptureWindowA" para inicializar el driver y capturar la imagen.
Después para manejar la ventana de captura tendremos que usar la función "SendMessage" lo que facilita y simplifica muchísimo el trabajo a los programadores.

Ahora vamos con el programa:

Como variables globales añadimos:

Ventana: hwnd; //Handle de la ventana de captura

En la sección "const" escribimos:


WM_CAP_START = WM_USER;
WM_CAP_STOP = WM_CAP_START + 68;
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
WM_CAP_SAVEDIB = WM_CAP_START + 25;
WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
WM_CAP_SEQUENCE = WM_CAP_START + 62;
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
WM_CAP_EDIT_COPY = WM_CAP_START + 30;
WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;


En la sección "implementation":


FUNCTION capCreateCaptureWindowA(lpszWindowName: PCHAR; dwStyle: longint; x: integer; y: integer; nWidth: integer; nHeight: integer; ParentWin: HWND; nId: integer): HWND; STDCALL EXTERNAL 'AVICAP32.DLL';


Es la llamada a la librería externa Avicap32.dll

Elementos de la interface:

-Botón "iniciar" (Al pulsarlo empezará la captura de la imagen procedente de la Webcam)

-Botón "detener" (Para parar la captura de la imagen)

-Control de Imagen "tImage" (lo llamaremos "Image1")



El código que se incluirá dentro de los botones es el siguiente:

Botón "Iniciar"
PROCEDURE TForm1.Button1Click(Sender: TObject);
BEGIN
  Ventana := capCreateCaptureWindowA('Ventana de captura',
     WS_CHILD OR WS_VISIBLE, image1.Left, image1.Top, image1.Width,
     image1.Height, form1.Handle, 0);
  IF Ventana <> 0 THEN
  BEGIN
     TRY
        SendMessage(Ventana, WM_CAP_DRIVER_CONNECT, 0, 0);
        SendMessage(Ventana, WM_CAP_SET_PREVIEWRATE, 40, 0);
        SendMessage(Ventana, WM_CAP_SET_PREVIEW, 1, 0);
     EXCEPT
        RAISE;
     END;
  END
  ELSE
  BEGIN
     MessageDlg('Error al conectar Webcam', mtError, [mbok], 0);
  END;
END;

Botón "Detener"



PROCEDURE TForm1.Button2Click(Sender: TObject);
BEGIN
  IF Ventana <> 0 THEN
  BEGIN
     SendMessage(Ventana, WM_CAP_DRIVER_DISCONNECT, 0, 0);
     Ventana := 0;
  END;
END;

En el evento Onclose deberemos hacer una llamada al procedimiento incluido en el botón "Detener".

Y eso es todo por ahora, en posteriores artículos iremos añadiendo más utilidades.

Links relacionados
Webcam con Delphi ( II )

WebCam con Delphi ( III )Webcam con OpenGL

Webcams:
Logitech C920 HD Pro
Creative Live Cam Chat HD
Logitec C270 Webcam para videoconferencias




15 comentarios:

  1. Hola,

    he probado este código, pero la imagen siempre se ve negra. No se muestra el movimiento en la misma.

    Ni siquiera cuando se detiene la "captura".

    Alguna idea de qué podría ser ? Estoy con Delphi 2010.

    Gracias.

    ResponderEliminar
    Respuestas
    1. Hola estoy probando y me pasa lo mismo, uso delphi 7 y tengo windows 7

      Eliminar
  2. Hola.. Yo uso delphi 2010 en un Windows 7 y funciona sin problemas
    , pero no es asi cuando intento pasar el ejecutable generado a un windows xp.Me dice que tengo problemas con la dll "msvcrt"
    y si, si tengo esa dll
    Ojala puedan ayudarme :)

    ResponderEliminar
  3. Intenta activar la opción del compilador "Build with runtime packages" en Project->Options->Packages

    ResponderEliminar
  4. Hola no se que he hecho pero al fin a funcionado xD
    En estos momentos se me presenta otro problema cuando deseo capturar la imagen que se muestra en pantalla:
    la sentencia Image1.Savetofile(C:\...\foto.jpg) no funciona :S
    Espero que puedan ayudarme
    Supongo que hay de utilizar una de las sentencias creadas mas arriba ¿no?

    ResponderEliminar
  5. Para guardar una imagen tienes que hacer:
    image1.picture.savetofile ('c:\fichero.jpg')

    ResponderEliminar
  6. Si esa es la funcion que estoy usando
    ,solo la tipee mal arriba por le apuro xP
    El error que da no parece ser un error de codigo, es decir compila sin problemas, solo que cuando programas el boton "guardar" con la sentencia Savetofile simplemente no pasa nada.No genera el archivo en la ruta especificada (c:\foto.bmp)
    Es algo frustrante :S
    Ojala puedan tirarmen una sugerencia de como hacerlo

    ResponderEliminar
  7. todo sale negro en caso de solucion maruonofre@gmail.com

    ResponderEliminar
  8. Hola me marca error,el error es :external excepcion C0000008, Y me manda a esta linea "SendMessage(Ventana, WM_CAP_SET_PREVIEWRATE, 40, 0);" utilizo delphi 7 en windows 7 y una cámara de usb. les agradecería que me pudieran ayudar y mandar un correo a dekor_ar@hotmail.com.

    Saludos.

    ResponderEliminar
  9. con Delphi 7 y WindowsXP funciona perfecto.
    Quizás podrías utilizar una versión superior de Delphi con Windows 7, para ver si el problema viene de ahí.

    ResponderEliminar
  10. Buenas tardes, a mi no me manda ningun mensaje de error pero no veo la imagen de la camara todo es negro, alguien sabe como resolverlo???

    Gracias por la ayuda

    ResponderEliminar
  11. A lo mejor te puede ayudar esto:
    Detector de movimiento con webcam
    http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=263

    o esto
    Delphi Webcam Capture Example
    https://sites.google.com/site/delphibasics/home/delphibasicssnippets/delphiwebcamcaptureexample

    ResponderEliminar
  12. el tamaño del video esta saliendo demasiado grande un video de 7 minuto sale con tamaño de 46,4 mb es demasiado grande es possible disminuirlo por que ademas no eres muy buena la calidad
    y si yo convierto el hacia avi mismo sendo lo mismo formato de el el damaño baja para unos 1,06 mb eres possible mejorar esto o cambiar el formato del video ???
    mi email eres isaacwith@outlook.com
    puedes ayudarme con esto???

    ResponderEliminar
  13. Alguien me puede ayudar, uso delphi 7 y windows 7, el problema que tengo es que no se activa la camara solo muesta la imagen en negro.

    ResponderEliminar
    Respuestas
    1. Lo mismo me pasa y no quiere mostrar alguien lo ah resuelto...

      Eliminar