SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: Emperorxdevil en Sábado 21 de Julio de 2007, 17:12

Título: Captura Webcam En C#
Publicado por: Emperorxdevil en Sábado 21 de Julio de 2007, 17:12
Hola a todos.

Aqui les dejo un clase propia para capturar imagenes con la webcam en C#

Esta clase, lista las cam's enchufafas al pc, captura fotos, permite redimensionar la imagen capturada antes de guardarla y elegir el formato de la imagen (jpg,bmp,etc)

Espero que les sirva.

Para usarla, declaren un nuevo objeto webcam.

En el constructor le dicen que frames /s capturara, un picturebox para mostrar la captura y un listbox ( en el que saldran las cam's detectadas).

Usen los metodos Listar, Capturar, StopCaptura y GuardarImagen


Espero que les sirva y les animo a mejorarla.

Namespaces Adicionales para que funcione la clase:
Código: Text
  1.  
  2. using System.Drawing;                              // Para Image
  3. using System.Drawing.Imaging;                // Para trabajar con imágenes
  4. using System.Drawing.Drawing2D;           // Para trabajar con Imágenes
  5. using System.Runtime.InteropServices;   // Para usar API
  6. using System.Windows.Forms;               // Para usar Formularios
  7.  
  8.  

Código: Text
  1.  
  2. public class WebCam  {
  3.    
  4.      // Conserva esta cabecera
  5.      // Empeorxdevil 2007
  6.    
  7.            class SaveImage {
  8.  
  9.           // Conserva esta cabecera
  10.           // Emperorxdevil 2007
  11.  
  12.                       /// <summary>
  13.                       /// Imagen que contiene la clase
  14.                       /// </summary>
  15.                       public  Image Tmp; //  referencia a la imagen del Picturebox Asociado
  16.                       Form Ref; // referencia que necesitare a este formulario
  17.                
  18.                         Form Opciones;
  19.                         GroupBox Gr;
  20.                         RadioButton R1;
  21.                         RadioButton R2;
  22.                         RadioButton R3;
  23.                         TextBox Porciento;
  24.                         TextBox Larg;        // Objetos necesarios para formar el diálogo
  25.                         TextBox Anch;
  26.                         Label L1;
  27.                         Label L2;
  28.                         Button Acepta;
  29.                         Button Cancelar;
  30.                    
  31.                         SaveFileDialog Sv;
  32.                         DialogResult rs;
  33.  
  34.  
  35.                 /// <summary>
  36.                 /// Constructor de clase SaveImage
  37.                 /// </summary>
  38.                 /// <param name="imagen">Imagen que se va a guardar</param>
  39.                 /// <param name="Interfaz"> Si se mostrará Interfaz</param>
  40.                 public SaveImage(Image imagen, bool Interfaz) {
  41.  
  42.                         Tmp=imagen; // Asigno la imagen...              
  43.                          Opciones= new Form();
  44.                          Ref=Opciones;
  45.                          Opciones.Width=333;     // Configuracion
  46.                          Opciones.Height=198;
  47.                          Opciones.Text="Parámetros de Imagen";
  48.                          Opciones.ControlBox=false;
  49.                          Opciones.ShowInTaskbar=false;
  50.                          Opciones.FormBorderStyle=FormBorderStyle.FixedDialog;
  51.  
  52.                              Gr= new GroupBox();
  53.                              Gr.Width=288;
  54.                              Gr.Height=105;
  55.                              Gr.Text="Configuración";
  56.                              Gr.Location= new Point(18,15);  
  57.                             Porciento= new TextBox();    
  58.                             Porciento.Enabled=false;                   // Configuracion
  59.                             Porciento.Text="";    
  60.                             Porciento.Width=37;
  61.                             Porciento.Height=20;
  62.                             Porciento.MaxLength=3;
  63.                             Porciento.TextAlign=HorizontalAlignment.Center;
  64.                             Porciento.Location= new Point(147,47);
  65.                                 R1= new RadioButton();
  66.                                 R1.Text="Guardar con Dimensiones Actuales";
  67.                                 R1.Width=191;
  68.                                 R1.Height=17;
  69.                                 Gr.Controls.Add(R1);
  70.                                 R1.Location= new Point(18,25);                                  
  71.                                 R2 = new RadioButton();
  72.                                 R2.CheckedChanged += new EventHandler(R2_CheckedChanged);
  73.                                 R2.Text="Reducir tamaño al";
  74.                                 R2.Width = 115;             // Configuracion
  75.                                 R2.Height = 17;
  76.                                 R2.Location= new Point(18,48);
  77.                                 Gr.Controls.Add(R2);
  78.                                 Gr.Controls.Add(Porciento);
  79.                                 L1 = new Label();
  80.                                 L1.Text="%";
  81.                                 L1.AutoSize=true;
  82.                                 L1.Location= new Point(195,50);
  83.                                 Gr.Controls.Add(L1);
  84.                                 R3 = new RadioButton();
  85.                                 R3.CheckedChanged += new EventHandler(R3_CheckedChanged);
  86.                                 R3.Text="Cambiar tamaño a"; // Configuracion
  87.                                 R3.Width=113;
  88.                                 R3.Height=17;
  89.                                 R3.Location= new Point(18,71);
  90.                                 Gr.Controls.Add(R3);
  91.                                 L2 = new Label();
  92.                                 L2.Text="X";
  93.                                 L2.AutoSize=true;
  94.                                 L2.Location=new Point(195,75);
  95.                                 Gr.Controls.Add(L2);
  96.                     Larg= new TextBox();
  97.                     Larg.Enabled=false;
  98.                     Larg.Width=37;
  99.                     Larg.Height=20;
  100.                     Larg.MaxLength=4;
  101.                     Larg.TextAlign=HorizontalAlignment.Center;
  102.                     Larg.Location= new Point(147,71);
  103.                     Gr.Controls.Add(Larg);
  104.  
  105.                     Anch= new TextBox();
  106.                     Anch.Enabled=false;
  107.                     Anch.Width=37;
  108.                     Anch.Height=20;
  109.                     Anch.MaxLength=4;
  110.                     Anch.TextAlign=HorizontalAlignment.Center; // Configuracion
  111.                     Anch.Location= new Point(218,70);
  112.                     Gr.Controls.Add(Anch);                    
  113.  
  114.                            Acepta= new Button();
  115.                            Acepta.Text="Aceptar";
  116.                            Acepta.Width=59;
  117.                            Acepta.Height=26;
  118.                            Acepta.Location= new Point(247,133);
  119.                            Acepta.Click += new EventHandler(Acepta_Click);
  120.  
  121.                            Cancelar= new Button();
  122.                            Cancelar.Text="Cancelar";
  123.                            Cancelar.Width= 59;
  124.                            Cancelar.Height=26;
  125.                            Cancelar.Location= new Point(18,133);
  126.                            Cancelar.Click += new EventHandler(Cancelar_Click);
  127.                                 Opciones.Controls.Add(Gr);
  128.                                 Opciones.Controls.Add(Acepta);
  129.                                 Opciones.Controls.Add(Cancelar);
  130.                                 Opciones.StartPosition=FormStartPosition.CenterScreen;
  131.                                 Opciones.ShowDialog();
  132.                      
  133.                 }
  134.  
  135.                
  136.                 /// <summary>
  137.                 /// Constructor de la clase SaveImage sin Interfaz
  138.                 /// </summary>
  139.                 /// <param name="imagen">Imagen a Guardar</param>
  140.                 public SaveImage(Image imagen) {
  141.                     Tmp = imagen; // Asigno la imagen...  
  142.                 }
  143.  
  144.                 void R3_CheckedChanged(object sender, EventArgs e)
  145.                {
  146.                    if (this.R3.Checked) { this.Anch.Enabled=true; this.Larg.Enabled=true;}
  147.                    else {this.Anch.Enabled=false; this.Larg.Enabled=false; }
  148.                }
  149.                 void R2_CheckedChanged(object sender, EventArgs e)
  150.                {
  151.                    if (this.R2.Checked) { this.Porciento.Enabled=true;}
  152.                    else { this.Porciento.Enabled=false; }
  153.                }
  154.                 void Acepta_Click(object sender, EventArgs e)
  155.                {
  156.                      try {
  157.                             if (R1.Checked|| R2.Checked||R3.Checked) {                
  158.                                    
  159.                              if (R2.Checked) {Tmp=Resize(Tmp,Convert.ToInt32(Porciento.Text));}
  160.                              
  161.                              if (R3.Checked) {Tmp=Resize(Tmp,Convert.ToInt32(Larg.Text),Convert.ToInt32(Anch.Text)); }      
  162.    
  163.                                    Sv= new SaveFileDialog(); // Creo un diálogo para salvar la imagen
  164.                                    Sv.Title = "Guardar imagen como..."; // Lo configuro
  165.                                    Sv.Filter = "Archivo JPG|*.jpg|Archivo PNG|*.png|Archivo GIF|*.gif|Mapa de Bits|*.bmp";
  166.                                    rs = Sv.ShowDialog(); // Lo muestro modal
  167.  
  168.  
  169.                                    if (rs == DialogResult.OK) {
  170.                                    
  171.                                        int x = Sv.FilterIndex; // Ontengo la extensión seleccionada  
  172.  
  173.                                        switch (x)
  174.                                        {
  175.                                            // Salvo la imagen en el formato deseado
  176.                                            case 1:
  177.                                                Tmp.Save(Sv.FileName, ImageFormat.Jpeg);
  178.                                                break;
  179.                                            case 2:
  180.                                                Tmp.Save(Sv.FileName, ImageFormat.Png);
  181.                                                break;
  182.                                            case 3:
  183.                                                Tmp.Save(Sv.FileName, ImageFormat.Gif);
  184.                                                break;
  185.                                            case 4:
  186.                                                Tmp.Save(Sv.FileName, ImageFormat.Bmp);
  187.                                                break;
  188.                                        }
  189.                                             Ref.Dispose(); // Cierro el formulario        
  190.                                    }
  191.                                 }
  192.                                 else { MessageBox.Show("Al menos debe selecionar una opción","xdevilWebCapture", MessageBoxButtons.OK, MessageBoxIcon.Warning); }
  193.  
  194.                                 }
  195.    
  196.                                 catch {
  197.                                     MessageBox.Show("Introduzca valores válidos", "xdevilWebCapture", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  198.                                 }      
  199.  
  200.                }                
  201.                 void Cancelar_Click(object sender, EventArgs e)
  202.                 {
  203.                      Ref.Dispose(); // Cierro el formulario
  204.                 }
  205.  
  206.  
  207.  
  208.                 /// <summary>
  209.                 /// Escala la imagen capturada al % especificado
  210.                 /// </summary>
  211.                 /// <param name="foto"> Imagen que se quiere escalar </param>
  212.                 /// <param name="TantoPorCiento"> Porcentaje de reducción</param>
  213.                 /// <returns>Imagen escalada</returns>
  214.                 public Image Resize(Image foto,int TantoPorCiento) {
  215.  
  216.                         float Tporciento=((float)TantoPorCiento/100); // Obtengo el coeficiente de dimension                    
  217.                         int ImgOrAncho=foto.Width;
  218.                         int ImgOrAlto=foto.Height; // Obtengo las dimensiones originales de la foto
  219.  
  220.                         int OrigX=0;
  221.                         int OrigY=0;
  222.                         int ResX=0;  // Variables referencia para saber donde empiezo a contar px
  223.                         int ResY=0;
  224.  
  225.                         int ResAncho=(int)(ImgOrAncho*Tporciento);
  226.                         int ResAlto = (int)(ImgOrAlto * Tporciento); // Obtengo las dimensiones al % especificado    
  227.  
  228.                       Bitmap RszIm= new Bitmap(ResAncho,ResAlto,PixelFormat.Format24bppRgb); // Creo una imagen con esas dimensiones y bpp
  229.                       RszIm.SetResolution(foto.HorizontalResolution,foto.VerticalResolution); // Le doy la misma res. que la original
  230.                        
  231.                       Graphics Gfoto= Graphics.FromImage(RszIm); // Creo una intancia de Graphics para manejar la imagen nueva
  232.                       Gfoto.InterpolationMode= InterpolationMode.HighQualityBicubic; // Especifico la calidad del algoritmo de sampleo
  233.                       // De la foto original, obtengo la redimensionada (mediante un rectángulo)
  234.                       Gfoto.DrawImage(foto,new Rectangle(ResX,ResY,ResAncho,ResAlto),new Rectangle(OrigX,OrigY,ImgOrAncho,ImgOrAlto),GraphicsUnit.Pixel);  
  235.                       Gfoto.Dispose(); // Ya no me hace falta esto, asi que lo descargo
  236.  
  237.                         return(RszIm); // Devuelvo la imagen redimensionada
  238.                 }
  239.                 /// <summary>
  240.                 /// Redimensiona la imagen en pixeles
  241.                 /// </summary>
  242.                 /// <param name="foto"> Imagen a redimensionar</param>
  243.                 /// <param name="ancho">Ancho de la imagen</param>
  244.                 /// <param name="alto">Alto de la imagen</param>
  245.                 /// <returns>Imagen redimensionada</returns>
  246.                 public Image Resize(Image foto, int ancho, int alto) {
  247.  
  248.                             int ImgORAncho = foto.Width;
  249.                             int ImgOrAlto =  foto.Height; // Obtengo las dimensiones de la foto
  250.  
  251.                             int OrigX = 0;
  252.                             int OrigY = 0;
  253.                             int ResX = 0;  // Varables referencia para saber donde contar px
  254.                             int ResY = 0;
  255.  
  256.                             float Porciento = 0;
  257.                             float PorcientoAncho = 0; // Porcentajes de sampleo
  258.                             float PorcientoAlto = 0;
  259.  
  260.                     PorcientoAncho = ((float)ancho / (float)ImgORAncho);
  261.                     PorcientoAlto  = ((float)alto / (float)ImgOrAlto); //Calculo el % que puedo resamplear
  262.    
  263.                         if (PorcientoAlto  < PorcientoAncho){
  264.                                     Porciento  = PorcientoAlto; }
  265.                             else { // Para resamplear bien                
  266.                                     Porciento = PorcientoAncho; }
  267.                          
  268.  
  269.                     int AnchuraFinal = (int)(ImgORAncho  * Porciento);
  270.                     int AlturaFinal;  // Calculo las nuevas dimensiones                
  271.        
  272.                             if (ancho >alto) {
  273.                                         AlturaFinal = (int)(ImgOrAlto  * Porciento); }
  274.                                else {
  275.                                     AlturaFinal =AnchuraFinal;} // Para proporcionar la imagen
  276.  
  277.                     Bitmap RszIm = new Bitmap(ancho, alto,PixelFormat.Format24bppRgb);
  278.                     RszIm.SetResolution(foto.HorizontalResolution,foto.VerticalResolution);
  279.  
  280.                     Graphics Gfoto = Graphics.FromImage(RszIm);
  281.                     Gfoto.InterpolationMode =InterpolationMode.HighQualityBicubic;
  282.                     Gfoto.DrawImage(foto,new Rectangle(ResX, ResY, AnchuraFinal, AlturaFinal),new Rectangle(OrigX, OrigY, ImgORAncho , ImgOrAlto),GraphicsUnit.Pixel);
  283.                     Gfoto.Dispose();
  284.                     return (RszIm);
  285.  
  286.                 }
  287.  
  288.             } /// Clase que guarda las imágenes
  289.  
  290.              #region Funciones API
  291.  
  292.           [DllImport("user32.dll", EntryPoint = "SendMessage")]
  293.           public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);
  294.  
  295.           [DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
  296.           public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);
  297.  
  298.           [DllImport("user32.dll", EntryPoint = "EmptyClipboard")]
  299.           public static extern int EmptyClipboard();
  300.          
  301.           [DllImport ("avicap32.dll",EntryPoint="capGetDriverDescriptionA")]
  302.           public static extern bool capGetDriverDescriptionA(int wdriver,string lpszName,int cbName,string lpszVer,int cbVer);
  303.  
  304.          
  305.              #endregion
  306.  
  307.              #region Constantes API
  308.  
  309.           const int WM_USER = 1024;
  310.           const int WM_CAP_CONNECT = 1034;
  311.           const int WM_CAP_DISCONNECT = 1035;
  312.           const int WM_CAP_GET_FRAME = 1084;  // Constantes necesarias
  313.           const int WM_CAP_COPY = 1054;
  314.           const int WM_CAP_START = WM_USER;
  315.           const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
  316.           const int WM_CAP_SET_PREVIEWRATE = WM_USER + 52;
  317.          
  318.        #endregion
  319.      
  320.              private int Frecuencia=0; // Frecuencia de captura de imagen  
  321.              private  int CamHandle=0; // Handle del dispositivo
  322.                      
  323.  
  324.              Timer reloj; // Timer
  325.              ComboBox Cbx; // Para referencia al Combobox
  326.              PictureBox Pbx; // Para referencia al Picturebox
  327.                        
  328.          
  329.         /// <summary>
  330.         /// Crea una instancia de la clase WebCam de Emperorxdevil
  331.         /// </summary>
  332.         /// <param name="frecuencia">Intervalo de tiempo en el que se capturarán las imágenes</param>
  333.         /// <param name="pct">PictureBox en el cual se mostrará lo capturado por la webcam</param>
  334.         /// <param name="cb"> Listbox en el que se mostrarán las Cams detectadas</param>
  335.         public WebCam(int frecuencia,PictureBox pct, ComboBox cb) {
  336.              
  337.             Frecuencia=frecuencia;
  338.             Pbx=pct;              // Inicio las variables necesarias
  339.             reloj= new Timer(); // Creo el timer
  340.             reloj.Tick += new EventHandler(reloj_Tick); // Le asigno el controlador  
  341.             reloj.Interval=Frecuencia; // Asigno la velocidad de captura
  342.             Cbx= cb; //Configuro la referencia
  343.            
  344.            }
  345.  
  346.         private void reloj_Tick(object sender, EventArgs e)
  347.         {
  348.  
  349.             SendMessage(CamHandle, WM_CAP_GET_FRAME,0,0); // Capturo la imagen
  350.             SendMessage(CamHandle, WM_CAP_COPY, 0, 0); // La copio al portapeles
  351.             Pbx.Image=Clipboard.GetImage(); // La mando al Picturebox
  352.             EmptyClipboard(); // Vacío el portapapeles
  353.            
  354.         }
  355.         /// <summary>
  356.         /// Listará las cámaras web encontradas en el Combobox asociado
  357.         /// </summary>
  358.         public void Listar() {
  359.                    
  360.               bool valor;
  361.               string nombre;    
  362.               string version;
  363.               int x=0;
  364.  
  365.                 do {
  366.                     nombre="Dispositivo"+x.ToString();
  367.                     valor=capGetDriverDescriptionA(x,nombre,100,"v1",100);
  368.                      if (valor) Cbx.Items.Add(nombre);
  369.                      x=x+1;
  370.                 } while (!valor==false);                      
  371.                    
  372.         }
  373.         /// <summary>
  374.         /// La WebCam se Encenderá y mostrará lo capturado en el PictureBox referenciado
  375.         /// </summary>
  376.         /// <param name="Dispositivo">Nº de dispositivo del Combobox</param>        
  377.         public void Capturar(int Dispositivo) {
  378.  
  379.                         try {
  380.                              
  381.                               StopCaptura(); // Antes de nada "reseteo" el dispositivo  
  382.                               CamHandle= capCreateCaptureWindowA("XdevilCapture"+Dispositivo.ToString(),0,0,0,0,0,Pbx.Handle.ToInt32(),Dispositivo); // Obtengo el Handle de la cam
  383.                               SendMessage(CamHandle, WM_CAP_CONNECT, 0, 0); // Enciendo la cam
  384.                               SendMessage(CamHandle,WM_CAP_SET_PREVIEWRATE,30,0); // Establezco los frames de captura /seg
  385.                               SendMessage(CamHandle, WM_CAP_SET_PREVIEW,0,0); // Empiezo a capturar
  386.                               reloj.Start(); // Inicio la captura      
  387.                         }
  388.  
  389.                         catch (Exception e) {
  390.                               MessageBox.Show("No se puede Iniciar la WebCam","Error");              
  391.                         }
  392.  
  393.               }
  394.         /// <summary>
  395.         /// Detiene la captura de imágenes y apaga la WebCam
  396.         /// </summary>
  397.         public void StopCaptura() {
  398.  
  399.  
  400.                        try {
  401.                            reloj.Stop(); // Paro el reloj que captura
  402.                            SendMessage(CamHandle, WM_CAP_DISCONNECT, 0, 0); // Apago la cam
  403.                            EmptyClipboard(); // Vacío el portapapeles
  404.                          }
  405.  
  406.                         catch (Exception e) { } // No hago nada.. pa k ?
  407.  
  408.               }
  409.         /// <summary>
  410.         /// Muestra diferentes parametros configurables de la imagen que se va a guardar
  411.         /// </summary>
  412.         public void GuardarImagen() {
  413.                  
  414.                 SaveImage s= new SaveImage(Pbx.Image,true); // Creo la clase que guarda las fotos
  415.               }  
  416.        
  417.      
  418.     }
  419.  
  420.  
  421.  

Salu2
Título: Re: Captura Webcam En C#
Publicado por: ProfesorX en Domingo 22 de Julio de 2007, 04:01
Me intereso tu clase, pero creo que deberias poner el codigo completo que utilizaste (formularios, clases extra, etc.) ya que me marco los siguientes errores:

Código: Text
  1.  
  2. C:\CvsProjects\proyecto-x\alfa\jubilee\QuickGUI\GenericProgramming\WebCam.cs(26,20): error CS0246: No se puede encontrar el tipo o el nombre de espacio de nombres 'Image' (¿falta una directiva using o una referencia de ensamblado?)
  3. C:\CvsProjects\proyecto-x\alfa\jubilee\QuickGUI\GenericProgramming\WebCam.cs(27,13): error CS0246: No se puede encontrar el tipo o el nombre de espacio de nombres 'Form' (¿falta una directiva using o una referencia de ensamblado?)
  4. C:\CvsProjects\proyecto-x\alfa\jubilee\QuickGUI\GenericProgramming\WebCam.cs(29,13): error CS0246: No se puede encontrar el tipo o el nombre de espacio de nombres 'Form' (¿falta una directiva using o una referencia de ensamblado?)
  5.  
  6.  

y asi sucesivamente

Saludos :)
Título: Re: Captura Webcam En C#
Publicado por: Emperorxdevil en Domingo 22 de Julio de 2007, 06:01
Gracias por reportar el error.
Por los errores que me muestras, faltan los namespaces:
Código: Text
  1.  
  2. System.Drawing;             // Para Image
  3. System.Windows.Forms;   //  Para Form
  4.  
  5.  
Ya los inclui arriba.
Salu2
Título: Re: Captura Webcam En C#
Publicado por: Neopro en Lunes 23 de Julio de 2007, 16:44
Interesante...

Grax.
Título: Re: Captura Webcam En C#
Publicado por: Geo en Lunes 23 de Julio de 2007, 18:21
Precisamente ahorita estoy buscando información sobre cómo adquirir imágenes desde una webcam :), estoy viendo si uso AVIcap o WIA, gracias por el ejemplo ;).
Título: Re: Captura Webcam En C#
Publicado por: lesus en Lunes 13 de Agosto de 2007, 10:38
Hola!
Estoy intentando realizar una aplicación de captura de imágenes con webcam. He probado el código y obtengo este error:

"'webcam.Form1.Dispose(bool)': no suitable method found to override"

He de decir que aún no la tengo conectada porque todavía no dispongo de ella, puede ser ese el problema?
Gracias de antemano. Saludos
Título: Re: Captura Webcam En C#
Publicado por: jesusjones en Jueves 13 de Diciembre de 2007, 21:10
muchas gracias :D, el código está genial...

por cierto modifique esta línea

Código: Text
  1.  
  2. public static extern bool capGetDriverDescriptionA(int wdriver, string lpszName, int cbName, string lpszVer, int cbVer);
  3.  
  4.  

por esta
Código: Text
  1.  
  2. public static extern bool capGetDriverDescriptionA(int wDriverIndex, [MarshalAs(UnmanagedType.VBByRefStr)]ref String lpszName, int cbName, [MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszVer, int cbVer);
  3.  
  4.  

así cuando listas en el combobox los devices, te aparece su nombre y no "dispositivo0"

Listar quedó así:

Código: Text
  1.  
  2. public void Listar()
  3.         {
  4.             bool valor;
  5.             String nombre = "".PadRight(100);&#59;
  6.             String version = "".PadRight(100);&#59;
  7.             int x = 0;
  8.             do
  9.             {
  10.                 valor = capGetDriverDescriptionA(x, ref nombre, 100, ref version, 100);
  11.                 if (valor)
  12.                 {
  13.                     Cbx.Items.Add(nombre + " " + version);
  14.                 }
  15.  
  16.                 x = x + 1;
  17.  
  18.             } while (!valor == false);
  19.         }
  20.  
  21.  
Título: Re: Captura Webcam En C#
Publicado por: HernanSaiz en Jueves 13 de Marzo de 2008, 23:11
hola, tu ejemplo funciono bien, excepto cuando quise separar en dos botones las funcionalidades: en el boton1 puse listar y capturar y en el boton2 puse stopcaptura y guardarimagen.
El problema es el ambito de la clase WebCam. En donde tengo que definir la la clase para que los metodos se vean de ambos botones?
Desde ya muchas gracias. Salu2 :blink:
Título: Re: Captura Webcam En C#
Publicado por: Tonio en Viernes 4 de Abril de 2008, 05:55
Soy estudiante.
Copio el codigo.
lo ejecuto.
pero me marca error en EventArgs
Error   1   No se puede encontrar el tipo o el nombre de espacio de nombres 'EventArgs' (¿falta una directiva using o una referencia de ensamblado?)   C:\Documents and Settings\Administrador\Mis documentos\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\WebCam.cs   154   51   WindowsApplication1


quisiera saber si me pueden ayudar gracias.
Título: Re: Captura Webcam En C#
Publicado por: pakoflako en Domingo 6 de Abril de 2008, 10:36
Sorprendente  :o , la verdad es ke ocupaba esta clase muchisimo
para un proyecto de seguridad que estoy realizando en la universidad  :smartass:,
Muchas gracias  :D , Me funciono perfecto..!!   ;) , Sale
Título: Re: Captura Webcam En C#
Publicado por: Arcangel_Asesino en Lunes 5 de Mayo de 2008, 09:56
hola soy nuevo pro este foro peor tengo un problema con la clase que posteaste tengo conectadas 2 cámaras web pero solo me reconoce 1 no sabes por que yo le he buscado la forma pero aun no se por que solo me reconoce de hecho no se si sea por que ambas cámaras usan el "Microsoft WDM Image Capture (Win32)"  :blink: y de hecho con la modificación es el único elemento que parece aunque el sistema si reconoce las 2 cam ya que las puedo activar desde los dispositivos que parecen en la carpeta de " Mi PC" me gustaría saber el por que y como arreglar ese detalle por que no he encontrado como hacerlo ... de todas formas sigo buscando gracias...
  :comp:

Agrego....

ya busque un poco mas y si agrego la constante
Código: Text
  1.  
  2. const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 42;
  3.  
  4.  
y lo mando como mensaje
Código: Text
  1.  
  2. SendMessage(CamHandle, WM_CAP_DLG_VIDEODISPLAY, 0, 0);
  3.  
  4.  
aparece una ventana de modificación y puedo cambiar de la cámara de entrada pero aun cuando tenga 2 objetos de la clase la camptura se cambia en objetos y no me permite tener el video de ambas cámaras al mismo tiempo...

Seguiré buscando ... :comp:

si alguien encuentra la disolución se lo agradecería muchísimo...
Título: Re: Captura Webcam En C#
Publicado por: madeinchiapas en Martes 21 de Julio de 2009, 20:08
Cita de: "Arcangel_Asesino"
hola soy nuevo pro este foro peor tengo un problema con la clase que posteaste tengo conectadas 2 cámaras web pero solo me reconoce 1 no sabes por que yo le he buscado la forma pero aun no se por que solo me reconoce de hecho no se si sea por que ambas cámaras usan el "Microsoft WDM Image Capture (Win32)"  :blink: y de hecho con la modificación es el único elemento que parece aunque el sistema si reconoce las 2 cam ya que las puedo activar desde los dispositivos que parecen en la carpeta de " Mi PC" me gustaría saber el por que y como arreglar ese detalle por que no he encontrado como hacerlo ... de todas formas sigo buscando gracias...
  :comp:

Agrego....

ya busque un poco mas y si agrego la constante
Código: Text
  1.  
  2. const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 42;
  3.  
  4.  
y lo mando como mensaje
Código: Text
  1.  
  2. SendMessage(CamHandle, WM_CAP_DLG_VIDEODISPLAY, 0, 0);
  3.  
  4.  
aparece una ventana de modificación y puedo cambiar de la cámara de entrada pero aun cuando tenga 2 objetos de la clase la camptura se cambia en objetos y no me permite tener el video de ambas cámaras al mismo tiempo...

Seguiré buscando ... :comp:

si alguien encuentra la disolución se lo agradecería muchísimo...

Hola que tal arcangel oye ando realizando la misma aplicacion y podemos trabajar juntos en base a la informacion que cada uno haya recolectado te parece!  ;)
t dejo mi correo , es en hotmail : made.in.chiapas ... saludos
Título: Re: Captura Webcam En C#
Publicado por: sangetzu en Viernes 7 de Agosto de 2009, 08:22
hola que tal soy nuevo en el foro y no se si alguien me podria ayudar kon un programa el kual konsta de reguistrar un cliente pero tengo ke tomarle foto y guardarla en una base de datos en access  y en otra  sql, pero la berdad no se ni komo soy nuevo programando, si alguien me pudiera ayudar se lo agradeseria, deantemano grasias ¡este es un exelente foro!
Título: Re: Captura Webcam En C#
Publicado por: Quicksilver en Lunes 24 de Agosto de 2009, 07:23
Yo lo he hecho en c#, pero utilizando la librería de Open Cv para c#.

Por cierto, es una lastima, por que los errores del C tienen que ser tan complejos o poco subjetivos... en fin... aca les dejo el ejemplo, claro, primero es necesario que descarguen la librería, la instalen y hagan las respectivas referencias a las dll's.

Código:

CvCapture capture;

            capture = highgui.CvCreateCameraCapture(0);

            IplImage image;

            highgui.CvNamedWindow("LiveView", highgui.CV_WINDOW_AUTOSIZE);

            //none of these seems to work
            highgui.CvSetCaptureProperty(ref capture, highgui.CV_CAP_PROP_FRAME_WIDTH, 640);
            highgui.CvSetCaptureProperty(ref capture, highgui.CV_CAP_PROP_FRAME_HEIGHT, 480);
            highgui.CvSetCaptureProperty(ref capture, highgui.CV_CAP_PROP_FPS, 10);
           

            while (true)
            {
                image = highgui.CvQueryFrame(ref capture);
                highgui.CvShowImage("LiveView", ref image);

                int c = highgui.CvWaitKey(40);
                if (c == 27)
                    break;
            }

            highgui.CvReleaseCapture(ref capture);
            highgui.CvDestroyWindow("LiveView");

Es tan sencillo como poner un botón, y pegar el código.... claro, hay que conocer muy bien la librería.
Título: Re: Captura Webcam En C#
Publicado por: camilojaraba en Martes 20 de Octubre de 2009, 22:24
Hum...
no funciona el StopCaptura...

que será?

otra cosa... como hago para poder usar diferentes botones?
es decir, tengo un Form1, y dentro varios private donde estan los botones...
pero me toca crear un objeto por cada private pues si lo coloco en la cabecera para establecerlo como publico y poder usarlo en todos los demas objects, me sale un error referente a los parametros que le paso al constructor picturebox y combobox...

saludos y gracias!!!
pD: si tienen informacion acerca de si puedo trabajar del mismo modo con tarjetas tipo geovision para CCTV seria excelente!

CJ
colombia
Título: Re: Captura Webcam En C#
Publicado por: tannke en Miércoles 21 de Octubre de 2009, 17:30
Sobre lo 1º ahora mismo no se, no tengo con que provar, cuando llegue a casa intentare mirartelo.

Para lo 2º no se si te entiendo muy bien, podrias poner que tipo de objeto quieres declarar o mejor, poner el codigo de la declaración para ver exactamente como declaras y donde.

por ejemplo para declarar un bitmap podia ser:
Código: C#
  1.  
  2. public Form1()
  3.         {
  4.             InitializeComponent();
  5.         }
  6.         Bitmap dibujo;
  7.  
  8.         private void boton1(object sender, EventArgs e)
  9.         {
  10.             dibujo = Image.FromFile(@"C:direccion");
  11.         }
  12.   
  13.  
  14.  

o incluso ya declararla con un valor...

saludos;
Título: Re: Captura Webcam En C#
Publicado por: camilojaraba en Miércoles 21 de Octubre de 2009, 18:43
Hum... gracias por responder!

mira, el codigo lo tengo así...
Código: C#
  1.  
  2. private void button1_Click(object sender, EventArgs e)
  3.         {
  4.             camaraweb camarita = new camaraweb(5, pictureimg, cmbcams);
  5.             camarita.Listar();
  6.         }
  7.  
  8.  
lo anterior para cada uno de los botones...

pero si lo coloco asi:
Código: C#
  1.  
  2. public partial class Form1 : Form
  3.     {
  4.         camaraweb camarita = new camaraweb(5, pictureimg, cmbcams);
  5.         public Form1()
  6.         {
  7.             InitializeComponent();    
  8.         }
  9.        
  10.         private void Form1_Load(object sender, EventArgs e)
  11.         {
  12.            
  13.         }
  14.  
  15.  
o lo coloco dentro del public form, me saca los errores:
Error   1   A field initializer cannot reference the non-static field, method, or property 'webcamcj.Form1.pictureimg'
Error   2   A field initializer cannot reference the non-static field, method, or property 'webcamcj.Form1.cmbcams'

gracias!
Título: Re: Captura Webcam En C#
Publicado por: tannke en Miércoles 21 de Octubre de 2009, 19:42
Uf ahora me pillas algo perdido... has probado con:

Código: C#
  1.  
  2.  
  3. public partial class Form1 : Form
  4.      {
  5.          camaraweb camarita;
  6.          public Form1()
  7.          {
  8.              InitializeComponent();    
  9.          }
  10.        
  11.          private void Form1_Load(object sender, EventArgs e)
  12.          {
  13.             camarita = new camaraweb(5, pictureimg, cmbcams);
  14.          }
  15.  
  16.  
  17.  
Título: Re: Captura Webcam En C#
Publicado por: camilojaraba en Jueves 22 de Octubre de 2009, 00:06
jajajaja que chiste...
justo me habia funcionado cuando recibi la notificacion de tu post!

gracias!!!

sera que este metodo me servira para capturar una imagen de una tarjeta de CCTV??? tipo geovision, maxdvr, etc???

chau!
Título: Re: Captura Webcam En C#
Publicado por: insth en Domingo 8 de Noviembre de 2009, 07:59
Hola, soy  nuevo en el foro, La info me ha sido sumamente util, intentaré adaptarla a mis necesidades. Si Llego a hacerle modificaciones significativas intentaré postearlas. Gracias por la aportación.
Título: Re: Captura Webcam En C#
Publicado por: Arcangel_Asesino en Miércoles 9 de Diciembre de 2009, 08:37
Cita de: "madeinchiapas"
Cita de: "Arcangel_Asesino"
hola soy nuevo pro este foro peor tengo un problema con la clase que posteaste tengo conectadas 2 cámaras web pero solo me reconoce 1 no sabes por que yo le he buscado la forma pero aun no se por que solo me reconoce de hecho no se si sea por que ambas cámaras usan el "Microsoft WDM Image Capture (Win32)"  :blink: y de hecho con la modificación es el único elemento que parece aunque el sistema si reconoce las 2 cam ya que las puedo activar desde los dispositivos que parecen en la carpeta de " Mi PC" me gustaría saber el por que y como arreglar ese detalle por que no he encontrado como hacerlo ... de todas formas sigo buscando gracias...
  :comp:

Agrego....

ya busque un poco mas y si agrego la constante
Código: Text
  1.  
  2. const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 42;
  3.  
  4.  
y lo mando como mensaje
Código: Text
  1.  
  2. SendMessage(CamHandle, WM_CAP_DLG_VIDEODISPLAY, 0, 0);
  3.  
  4.  

 la verdad ya tenia tiempo que no venia por aca....

El mio es angel_asesino = de hotmail = y si nos podemos ayudar....

ahora tengo una nueva duda = y ealgo basica pero donde demonios le puedo cambiar la resolución a la captura es muy pekeña y no encuentro como configurar el Microsoft WDM Image Capture (Win32) o donde le muevo para cambiarla en Vista y win 7 que haoratengo que desarrollar para esas plataformas tan hermeticas

aparece una ventana de modificación y puedo cambiar de la cámara de entrada pero aun cuando tenga 2 objetos de la clase la camptura se cambia en objetos y no me permite tener el video de ambas cámaras al mismo tiempo...

Seguiré buscando ... :comp:

si alguien encuentra la disolución se lo agradecería muchísimo...

Hola que tal arcangel oye ando realizando la misma aplicacion y podemos trabajar juntos en base a la informacion que cada uno haya recolectado te parece!  ;)
t dejo mi correo , es en hotmail : made.in.chiapas ... saludos

el mio es angel_asesino = de hot ...

Ya tenia rato que no andaba por aqui pero recien tengo  que ver con esto... otravez

y ahora me enfrento al problema de no poder modificar la resolución de la captura me sale una imagen vastante pekeña supongo que debo configurar el Microsoft WDM Image Capture (Win32) pero no encuntro donde demonios hacerlo ya que adeams ahora lo tengo que desarrollar para windows Vista y  7  :S  <_< alguien por ahi sabe como hacerlo?

tambien si alguien  tiene lana o les financian encontre esta activeX que parece que tiene mucho que ofrecer fathsoft.com/videocapx.html aunque por desgracia se vende y a veces es mejor que uno conosca bie ntodas las tripas de su aplicacion pero si alguien le compran lo apis en la empresa y no tiene tiempo esta es una buena solicion creo,,,
Título: Re: Captura Webcam En C#
Publicado por: chayma en Martes 8 de Febrero de 2011, 17:32
Hola, me parece muy interesante el codigo de la captura de la webCam con c#,  
  y me gustaria saber como has inicializado las constantes de la Api de Windows, y donde puedo encontrar un tutorial de las funciones de la Api.
 
       

        muchas Gracias
Título: Re:Captura Webcam En C#
Publicado por: Jheiron en Miércoles 7 de Septiembre de 2011, 16:52
hola necesito ayuda..estoy usando esa clase y todo va bien pero el hecho de que no se detenga la cam cuando invico el metodo StopCaptura() me da problemas

estoy haciendo carnets con crystal report..todo bien pero como la cam no se desactiva el formulario del reporte se queda cargando..como se que es por eso..

porque cuando creo el carnet y no activo la cam me sube el reporte de una vez con la imagen de ese estudiantes..y cuando activo la cam se queda cargando y no deja de cargar..si alguien sabe como detener la cam que por favor me diga..Gracias  :/
Título: Re:Captura Webcam En C#
Publicado por: JaviMarciano en Miércoles 28 de Septiembre de 2011, 16:29
me da error cada vez que hay esto:
&#34
Título: Re:Captura Webcam En C#
Publicado por: tannke en Viernes 30 de Septiembre de 2011, 09:55
cambia el &#34; por las " comillas
es algun tipo de error del explorador o ago, dale al siguiente enlace, es el mismo de esta página pero pasado por el traductor de google, y mira en que se transforman esos caracteres ratos:

http://translate.google.es/translate?hl=es&sl=en&tl=es&u=http%3A%2F%2Fsolocodigo.com%2F30381%2Fcaptura-webcam-en-c%2F

saludos
Título: Re:Captura Webcam En C#
Publicado por: gabio2 en Viernes 7 de Octubre de 2011, 06:40
Exelente aporte Emperorxdevil muchas gracias! :)...


Una duda, alguien ha resolvido el problema con los equipos de 64 bits, me imagino que el avicap32.dll  sólo trabaja para maquinas en 32 bits, si alguien tiene idea de como solucionar ese detalle agradeceria mucho la ayuda.

Ya intente usar el WIA pero por lo que veo sólo acepta determinadas marcas y modelos de camaras...

Muchas gracias por leer y ojala alguien pueda apoyarme ... saludos.. :)
Título: Re:Captura Webcam En C#
Publicado por: gabio2 en Lunes 10 de Octubre de 2011, 23:24
Para los que no funcione en 64 Bits, cambien la plataforma de solución a x86 y listo funciona perfectamente inclusive en S.O windows de 64Bits. :) .. saludos! .... funciona perfectamente. :D
Título: Re:Captura Webcam En C#
Publicado por: aldosc en Miércoles 7 de Diciembre de 2011, 09:11
de casualidad no tendran ya todo metido en visual studio c# esq para el proyecto de redes q lo necesito y no soy muy bueno para programar si alguien me ayudase seria excelente mas q ya tengo poco tiempo y me lo envian a este correo cuchosc92@gmail.com y se lo agradeceria mucho
Título: Re: Captura Webcam En C#
Publicado por: aldosc en Miércoles 7 de Diciembre de 2011, 09:23
Me intereso tu clase, pero creo que deberias poner el codigo completo que utilizaste (formularios, clases extra, etc.) ya que me marco los siguientes errores:

Código: Text
  1.  
  2. C:\CvsProjects\proyecto-x\alfa\jubilee\QuickGUI\GenericProgramming\WebCam.cs(26,20): error CS0246: No se puede encontrar el tipo o el nombre de espacio de nombres 'Image' (¿falta una directiva using o una referencia de ensamblado?)
  3. C:\CvsProjects\proyecto-x\alfa\jubilee\QuickGUI\GenericProgramming\WebCam.cs(27,13): error CS0246: No se puede encontrar el tipo o el nombre de espacio de nombres 'Form' (¿falta una directiva using o una referencia de ensamblado?)
  4. C:\CvsProjects\proyecto-x\alfa\jubilee\QuickGUI\GenericProgramming\WebCam.cs(29,13): error CS0246: No se puede encontrar el tipo o el nombre de espacio de nombres 'Form' (¿falta una directiva using o una referencia de ensamblado?)
  5.  
  6.  

y asi sucesivamente

Saludos :)

holaa de casualidad no tenien ya todo en visual esq me urge un cod asi para un proyecto de redes pero no  tengo el tiempo para desarrollar y nos soy muy buen programador no se si me podrian ayudar se los agradeceria mucho si me lo envian a este correo cuchosc92@gmail.com esq de eso depende mi curso de resdes espero algun correo gracias!!!
Título: Re:Captura Webcam En C#
Publicado por: efreyre en Martes 6 de Marzo de 2012, 18:12
Estimados, llegué a este foro buscando información de como trabajar con la cámara web. Y agradezco a todos los que han colaborado, es especial al amigo tannke por iniciar el hilo.

Bueno, para hacerla corta, he probado el código y he armado la solución .NET, la cual pueden descargar desde esta página. (Necesitan el descompresor para archivos 7z).

http://electronica.phpnet.us/programacion.php (http://electronica.phpnet.us/programacion.php)

Espero que les sirva.

Saludos

Ernesto