none
Webcam impossible ! RRS feed

  • Question

  • Bonjour ! 

    J'aimerais lire des codes barres (EAN) via la webcam du poste, cependant je n'arrive pas à récupérer l'image de ma WebCam, celle-ci m'affiche un fond vert et rien d'autre. (Ma Webcam fonctionne bien) 

    Pour afficher ma Webcam j'utilise une classe récupéré dans la librairie ZXing, la classe Webcam suivante : 

    using System;
    using System.Collections;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace WebCamTest
    {
       public class WebCam : IDisposable
       {
          private const int WM_CAP = 0x400;
          private const int WM_CAP_DRIVER_CONNECT = 0x40a;
          private const int WM_CAP_DRIVER_DISCONNECT = 0x40b;
          private const int WM_CAP_EDIT_COPY = 0x41e;
          private const int WM_CAP_GET_FRAME = 1084;
          private const int WM_CAP_COPY = 1054;
          private const int WM_CAP_SET_PREVIEW = 0x432;
          private const int WM_CAP_SET_OVERLAY = 0x433;
          private const int WM_CAP_SET_PREVIEWRATE = 0x434;
          private const int WM_CAP_SET_SCALE = 0x435;
          private const int WS_CHILD = 0x40000000;
          private const int WS_VISIBLE = 0x10000000;
          private const int SWP_NOMOVE = 0x2;
          private const int SWP_NOZORDER = 0x4;
          private const int HWND_BOTTOM = 1;
    
          //This function enables enumerate the web cam devices
          [DllImport("avicap32.dll")]
          protected static extern bool capGetDriverDescriptionA(short wDriverIndex,
              [MarshalAs(UnmanagedType.VBByRefStr)]ref String lpszName,
             int cbName, [MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszVer, int cbVer);
    
          //This function enables create a  window child with so that you can display it in a picturebox for example
          [DllImport("avicap32.dll")]
          protected static extern int capCreateCaptureWindowA([MarshalAs(UnmanagedType.VBByRefStr)] ref string lpszWindowName,
              int dwStyle, int x, int y, int nWidth, int nHeight, int hWndParent, int nID);
    
          //This function enables set changes to the size, position, and Z order of a child window
          [DllImport("user32")]
          protected static extern int SetWindowPos(int hwnd, int hWndInsertAfter, int x, int y, int cx, int cy, int wFlags);
    
          //This function enables send the specified message to a window or windows
          [DllImport("user32", EntryPoint = "SendMessageA")]
          protected static extern int SendMessage(int hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)] object lParam);
    
          //This function enable destroy the window child 
          [DllImport("user32")]
          protected static extern bool DestroyWindow(int hwnd);
    
          // Normal device ID
          int DeviceID = 0;
          // Handle value to preview window
          int hHwnd = 0;
          //The devices list
          ArrayList ListOfDevices = new ArrayList();
    
          //The picture to be displayed
          public PictureBox Container { get; set; }
    
          // Connect to the device.
          /// <summary>
          /// This function is used to load the list of the devices 
          /// </summary>
          public void Load()
          {
             string Name = String.Empty.PadRight(100);
             string Version = String.Empty.PadRight(100);
             bool moreDevices;
             short index = 0;
    
             // Load name of all avialable devices into the lstDevices .
             do
             {
                // Get Driver name and version
                moreDevices = capGetDriverDescriptionA(index, ref Name, 100, ref Version, 100);
                // If there was a device add device name to the list
                if (moreDevices)
                   ListOfDevices.Add(Name.Trim());
                index += 1;
             }
             while (moreDevices);
          }
    
          /// <summary>
          /// Function used to display the output from a video capture device, you need to create 
          /// a capture window.
          /// </summary>
          public void OpenConnection()
          {
             string DeviceIndex = Convert.ToString(DeviceID);
             IntPtr oHandle = Container.Handle;
    
             // Open Preview window in picturebox .
             // Create a child window with capCreateCaptureWindowA so you can display it in a picturebox.
    
             hHwnd = capCreateCaptureWindowA(ref DeviceIndex, WS_VISIBLE | WS_CHILD, 0, 0, 640, 480, oHandle.ToInt32(), 0);
    
             // Connect to device
             if (SendMessage(hHwnd, WM_CAP_DRIVER_CONNECT, DeviceID, 0) != 0)
             {
                // Set the preview scale
                SendMessage(hHwnd, WM_CAP_SET_SCALE, -1, 0);
                // Set the preview rate in terms of milliseconds
                SendMessage(hHwnd, WM_CAP_SET_PREVIEWRATE, 100, 0);
                // Start previewing the image from the camera
                SendMessage(hHwnd, WM_CAP_SET_PREVIEW, -1, 0);
                // Resize window to fit in picturebox
                SetWindowPos(hHwnd, HWND_BOTTOM, 0, 0, Container.Width, Container.Height, SWP_NOMOVE | SWP_NOZORDER);
             }
             else
             {
                // Error connecting to device close window
                DestroyWindow(hHwnd);
             }
          }
    
          void CloseConnection()
          {
             SendMessage(hHwnd, WM_CAP_DRIVER_DISCONNECT, DeviceID, 0);
             // close window
             DestroyWindow(hHwnd);
          }
    
          public Bitmap GetCurrentImage()
          {
             // get the next frame;
             SendMessage(hHwnd, WM_CAP_GET_FRAME, 0, 0);
    
             // copy the frame to the clipboard
             SendMessage(hHwnd, WM_CAP_COPY, 0, 0);
    
             // Get image from clipboard and convert it to a bitmap
             IDataObject data = Clipboard.GetDataObject();
             if (data.GetDataPresent(typeof(Bitmap)))
             {
                var oImage = (Bitmap)data.GetData(typeof(Bitmap));
                Container.Image = oImage;
                return oImage;
             }
    
             return null;
          }
    
          ~WebCam()
          {
             Dispose(false);
             GC.SuppressFinalize(this);
          }
    
          public void Dispose()
          {
             Dispose(true);
          }
    
          virtual protected void Dispose(bool disposing)
          {
             CloseConnection();
          }
       }
    }


    Et voici le code de ma page : 

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    
    using ZXing;
    
    namespace WebCamTest
    {
        public partial class Form1 : Form
        {
            private WebCam wCam;
            private Timer webCamTimer;
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void btn_Cam_Click(object sender, EventArgs e)
            {
                if (wCam == null)
                {
                    wCam = new WebCam { Container = BoxCam };
    
                    wCam.OpenConnection();
    
                    webCamTimer = new Timer();
                    webCamTimer.Tick += webCamTimer_Tick;
                    webCamTimer.Interval = 200;
                    webCamTimer.Start();
                }
                else
                {
                    webCamTimer.Stop();
                    webCamTimer = null;
                    wCam.Dispose();
                    wCam = null;
                }
            }
    
            void webCamTimer_Tick(object sender, EventArgs e)
            {
                var bitmap = wCam.GetCurrentImage();
                if (bitmap == null)
                    return;
                var reader = new BarcodeReader();
                var result = reader.Decode(bitmap);
                if (result != null)
                {
                    /*txtTypeWebCam.Text = result.BarcodeFormat.ToString();
                    txtContentWebCam.Text = result.Text;*/
                }
            }
        }
    }

    Actuellement quand je clique sur mon bouton, il me fait choisir mon périphérique, (Integrated Webcam) je valide et rien ne se passe, je ne sais pas réellement ou chercher si quelqu'un à une idée pour ce soucis, je suis preneur ! 

    Merci d'avance, 

    Krishn4k

    mardi 14 octobre 2014 09:59

Réponses

  • Il y a du nouveau sur ce soucis, en fait le code fonctionne, une fois sur 15, si je "martèle" mon bouton, ma fenêtre de choix de périphérique ne s'affiche pas, et ma webcam se lance directement, une solution que j'ai pu voir sur les forums serait de lancer l'appel de ma Webcam dans une boucle qui ne s’arrêterait que lorsque celle-ci s’affiche correctement, mais ça me semble être du bricoloage ! 

    Krishn4k

    • Marqué comme réponse Krishn4k mercredi 15 octobre 2014 13:12
    mercredi 15 octobre 2014 09:55

Toutes les réponses

  • Bonjour,

    C'est un programme intéressant, j'ai essayé de trouver où peut être l'erreur mais jusqu'à maintenant sans succès. J'espère que quelqu'un avec plus d'expérience va donner une suggestion pour que nous comprenions comment faire cela.

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    mercredi 15 octobre 2014 09:44
    Modérateur
  • Il y a du nouveau sur ce soucis, en fait le code fonctionne, une fois sur 15, si je "martèle" mon bouton, ma fenêtre de choix de périphérique ne s'affiche pas, et ma webcam se lance directement, une solution que j'ai pu voir sur les forums serait de lancer l'appel de ma Webcam dans une boucle qui ne s’arrêterait que lorsque celle-ci s’affiche correctement, mais ça me semble être du bricoloage ! 

    Krishn4k

    • Marqué comme réponse Krishn4k mercredi 15 octobre 2014 13:12
    mercredi 15 octobre 2014 09:55