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.











19 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. 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
  12. 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
    2. Tambien me sale solo en negro, lo hice con una camara HD y me sale en negro, puse una webcam sencilla y si me da la imagen, pero necesito usar la webcam HD, alguien sabe como le puedo hacer?

      Eliminar
    3. Lo hice con delphi 2010 y win10

      Eliminar
  13. Lo usé con Delphi 7 Windows 7 en una Dell vostro 3560 y funcionó perfectamente

    ResponderEliminar
  14. buenos dias , me da un error en la variable "ventana " al parecer no esta declarada

    ResponderEliminar

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...