IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Acquisition d'une image WebCam a l'aide de WIA


Sujet :

C++Builder

  1. #1
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut Acquisition d'une image WebCam a l'aide de WIA
    Bonjour
    A la suite de ce poste
    Voici comment acquerir une image a partir d'une Webcam, bien sur le code est simpliste il n'y a aucun teste lors de la sauvegarde et pas de previsualisation
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    Variant wzd, vct, dev, item, imfile;
    wzd = Variant::CreateObject("WIA.CommonDialog");
    vct = Variant::CreateObject("WIA.Vector");
    // acquisition du type de periferique
    // Enum WiaDeviceType
    //    UnspecifiedDeviceType = 0
    //    ScannerDeviceType = 1
    //    CameraDeviceType = 2
    //    VideoDeviceType = 3
    // End Enum
    // acquisition du periferique
    dev = wzd.OleFunction("ShowSelectDevice", 3, true, true); // VideoDeviceType = 3
    // acquisition d'une image a partir de la WebCam
    // wiaCommandTakePicture = "{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}"
    item = dev.OleFunction("ExecuteCommand", "{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");
    // transfert de l'image
    imfile = item.OleFunction("Transfer");
    // sauvegarde de l'image
    imfile.OleFunction("SaveFile", "C:\\Documents and Settings\\blondelle\\Mes documents\\Mes images\\Video_Wia.jpg");
     
    wzd = Unassigned;
    vct = Unassigned;
    }

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Points : 288
    Points
    288
    Par défaut
    très intéréssent,...
    merci

  3. #3
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Merci pour ce post. J'ai vu ton code, je me pose la question : De quels tests tu parle ? La verification du fichier s'il existe ?

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut kmaniche
    Il n'y a pas de teste pour verifier s'il y a une WebCam, qui a l'occasion peut etre consideree comme une Camera, ou si elle est disponible, il n'y a pas de teste non plus pour verifier si le fichier image existe deja

  5. #5
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Tu as une idée sur la vérification de l'existance d'un webcam ?

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Non pas encore d'idee sur le controle de l'existence d'une WebCam

  7. #7
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Je pense qu'il ya un exemple de teste en utilisant DirectX, mais cela reste lié à ce dernier.

  8. #8
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Citation Envoyé par kmaniche Voir le message
    Tu as une idée sur la vérification de l'existance d'un webcam ?
    Suffit sans doute de tester si dev est NULL :

    ShowSelectDevice :

    Displays a dialog box that enables the user to select a hardware device for image acquisition. Returns the selected Device object on success, otherwise Nothing.
    a+

  9. #9
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, voici une fonction pour énumérer les drivers de capture installé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        char szDeviceName[100]; // driver name
        char szDeviceVersion[100]; // driver version
        String str; // concatinated string
        int xcap = 0; // counter
        TStringList *pStringCapDrivers = new TStringList;
     
        do
        {
            if (capGetDriverDescription(xcap, szDeviceName, sizeof(szDeviceName),
                szDeviceVersion, sizeof(szDeviceVersion)))
            {
                str = String(szDeviceName) + ", " + String(szDeviceVersion);
                pStringCapDrivers->AddObject (str, (TObject *)xcap);
            }
            else
            {
                break;
            }
            xcap++;
        } while (true);
    Il faut inclure ceci:
    Ceci est un bout de code modifié provenant du site http://www.allanpetersen.com/?q=node/13

    PS: J'ai pas tester le code, j'ai pas de WebCam ici

  10. #10
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci ero-sennin et Crayon pour vos reponses, je termine la traduction des morceaux de programme sur WIA et je modifierais le code de ce post pour y integrer les testes

  11. #11
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    J'ai repris mon code et j'en ai profite pour uniformiser mes variable, j'ai inclus le teste de camera/ WebCam presente, je pensais inclure la visualisation de l'image capturee mais j'ai une erreur que je n'arrive pas a solutionner, voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    void __fastcall TForm1::Button14Click(TObject *Sender)
    {
    Variant vMSWIADeviceManager1, vMSWIADeviceInfo, vMSWIADevice, VideoPreview1;
    Variant vMSWIAItem, vMSWIAImageFile;
     
    vMSWIADeviceManager1 = Variant::CreateObject("WIA.DeviceManager");
    VideoPreview1 = Variant::CreateObject("WIA.VideoPreview");
    vMSWIAImageFile = Variant::CreateObject("WIA.ImageFile");
     
    // wiaEventDeviceConnected = "{A28BBADE-64B6-11D2-A231-00C04FA31809}"
    vMSWIADeviceManager1.OleProcedure("RegisterEvent", "{A28BBADE-64B6-11D2-A231-00C04FA31809}");
    // wiaEventDeviceDisconnected = "{143E4E83-6497-11D2-A231-00C04FA31809}"
    vMSWIADeviceManager1.OleProcedure("RegisterEvent", "{143E4E83-6497-11D2-A231-00C04FA31809}");
    // (1) correspond au premier objet connecté
    vMSWIADeviceInfo = vMSWIADeviceManager1.OlePropertyGet("DeviceInfos").OlePropertyGet("Item", 1);
    // récupère la connexion active
    vMSWIADevice = vMSWIADeviceInfo.OleFunction("Connect");
    // acquisition du type de periferique
    // Enum WiaDeviceType
    //    UnspecifiedDeviceType = 0
    //    ScannerDeviceType = 1
    //    CameraDeviceType = 2
    //    VideoDeviceType = 3
    // End Enum
    if(vMSWIADevice.OlePropertyGet("Type") == 3)
            {
            VideoPreview1.OlePropertySet("Device", vMSWIADevice);
            }
    // effectue la capture d'image
    // wiaCommandTakePicture = "{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}"
    vMSWIAItem = vMSWIADevice.OleFunction("ExecuteCommand", "{AF933CAC-ACAD-11D2-A093-00C04F72DC3C}");
    if(!VarIsEmpty(vMSWIAItem))
            {
            vMSWIAImageFile = vMSWIAItem.OleFunction("Transfer");
            }
    // affiche l'image capturée dans un objet "Image"
    Image1->Picture = vMSWIAImageFile.OlePropertyGet("FileData").OlePropertyGet("Picture");
    // [C++ Error] Unit1.cpp(694): E2034 Cannot convert 'Variant' to 'TPicture *'
    // pour enregistrer la capture sur le disque
    vMSWIAImageFile.OleFunction("SaveFile", "C:\\Documents and Settings\\blondelle\\Mes documents\\Mes images\\monimageTest_WIA_V02.jpg");
    }
    cette ligne provoque une erreur et je ne vois pas comment proceder pour transtyper le Variant en TPicture
    Image1->Picture = WideString(vMSWIAImageFile.OlePropertyGet("FileData").OlePropertyGet("Picture"));
    // [C++ Error] Unit1.cpp(694): E2034 Cannot convert 'Variant' to 'TPicture *'

  12. #12
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Je cherche du cote de " SetOlePicture "
    extrait de l'aide en ligne
    Connecte un objet image OLE à un objet TPicture et copie ses propriétés vers TPicture.
    Unité
    AxCtrls
    Catégorie
    utilitaires COM
    typedef System:elphiInterface< IPictureDisp > _di_IPictureDisp;
    extern PACKAGE void __fastcall SetOlePicture(Graphics::TPicture* Picture, _di_IPictureDisp OlePicture);
    Description
    Les conventions OLE implémentent les images comme des objets automation contenant les propriétés de l'image. Cette routine associe un objet image OLE (le paramètre OlePicture) à une image VCL native (le paramètre Picture), ce qui permet à l'image d'être manipulée par les programmes OLE et VCL. L'objet TPicture est initialisé avec les mêmes propriétés que OlePicture.
    Appelez cette méthode lorsque vous implémentez une méthode automation qui accepte une image OLE comme paramètre et qui doit transmettre l'image comme un objet TPicture.
    Je n'arrive pas comprendre comment mettre en oeuvre cette fonction

  13. #13
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut Blondelle,

    Tout d'abord, je tiens à te remercier grandement pour tout ce travail que tu fournis, je trouve cela très intéressant

    Le code fournis pour prendre une photo avec la WebCam marche très très bien au final. Mon PC doit avoir un petit soucis car j'ai testé autre part, et là, tout se déroule très bien

    En revanche, je suis désolé de n'être d'aucune utilité face aux divers soucis rencontrés ... N'ayant que peu d'expériences en C++, je tâtonne beaucoup! Même la conversion sous Delphi me pose quelque soucis au niveau des interfaces

    Je te souhaite bon courage dans la suite de ton "tuto" (car oui, ça pourrait en être un).

    Cordialement,
    Ero

  14. #14
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Si je trouve une solution pour passer le Variant dans le Timage, je vais pouvoir terminer tous les exemple du tuto cite en reference, mais la pour l'instant je seche

  15. #15
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Tu as essayé de faire un transtypage ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    ... = (TPicture) ...

    Sinon, essaye de passer par un bitmap !!

  16. #16
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci kmaniche pour ta reponse
    Peu tu developper un peu plus le transtypage, parceque la je ne vois pas trop, ( probablement la fatique le cerveau ramoli )

  17. #17
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    J'ai trouve ce lien en Delphie
    Je pense que c'est la facon de resoudre mon probleme, le malheur c'est qu"en plus c'est en anglais, j'y comprend rien

  18. #18
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    J'ai pas un compte sur le site que tu as posté. Mais donne moi la solution, j'essaierai de t'aider !!

  19. #19
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Merci kmaniche
    Voici le texte du post cite dans le lien precedent
    http://www.experts-exchange.com/Prog..._23446083.html

    La question

    Tags:
    Delphi WebCam Capture Picture Windows Image Acquisition wiaaut
    Using Microsoft Windows Image Acquisition Library v2.0 "wiaaut.dll"
    the following code almost works, see code comments;
    procedure TForm1.Button1Click(Sender: TObject);
    var
    Itm: Item;
    Img: ImageFile; // Type = IDispatch & IUnKnown
    begin
    Itm := VideoPreview1.Device.ExecuteCommand(wiaCommandTakePicture);
    Img := Itm.Transfer( wiaFormatBMP); // This line returns this error;
    // [Error] Unit1.pas(292): Incompatible types: 'OleVariant' and 'IImageFile'
    Img.SaveFile('c:\Temp\Temp.bmp'); // This is the final required step.
    end;
    --------------------------------------

    La reponse

    // Requires ActiveX in uses clause
    function OleVarToIntf(OleVar: OleVariant; IID: TGUID; out Obj): HResult;
    var lpVarArg: PVariantArg;
    begin
    // Clear outbound param
    Pointer(Obj):=nil;
    // Cast OLE variant to its true type
    lpVarArg:=PVariantArg(@OleVar);
    // Check for IDispatch
    if (lpVarArg^.vt = VT_DISPATCH) and Assigned(lpVarArg^.dispVal) then
    // QI for desired interface
    result:=IDispatch(lpVarArg^.dispVal).QueryInterface(IID, Obj)
    // Check for IUnknown
    else if (lpVarArg^.vt = VT_UNKNOWN) and Assigned(lpVarArg^.unkVal) then
    // QI for desired interface
    result:=IUnknown(lpVarArg^.dispVal).QueryInterface(IID, Obj)
    else
    // No interface
    result:=E_NOINTERFACE;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var Itm: Item;
    Img: ImageFile;
    begin
    // Convert the OLE variant to the interface that it is holding
    if (OleVarToIntf(VideoPreview1.Device.ExecuteCommand(wiaCommandTakePicture), Item, Itm) = S_OK) then
    begin
    // Don't have the tlb conversion for this library, but check to see what Transfer(...)
    // returns. If it returns an ImageFile interface then nothing else needs to be done.
    // If it returns OleVariant then you will need to cast the result as well, eg:
    //
    // if (OleVarToIntf(Itm.Transfer(wiaFormatBMP), ImageFile, Img) = S_OK) then
    // begin
    // Img.SaveFile('c:\temp\temp.bmp');
    // end;
    //
    Img:=Itm.Transfer(wiaFormatBMP);
    Img.SaveFile('c:\Temp\Temp.bmp');
    end;
    end;

  20. #20
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Voila ou j'en suis pour l'instant, bien sur ca ne fonctionne pas et j'ai plein d'erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    HRESULT hresult;
    IUnknown FAR* punk;
    IDispatch FAR* pdisp = (IDispatch FAR*)NULL;
    // OLECHAR FAR* szMember = "simple";
    DISPID dispid;
    DISPPARAMS dispparams;
     
    if((dispparams.rgvarg[0].vt = VT_DISPATCH) & Assign (dispparams.rgvarg[0].pdispVal))
    {
    hresult = IDispatch(dispparams.rgvarg[0].pdispVal).QueryInterface(IID_IDispatch, Image1->Picture);
    }
    else if((dispparams.rgvarg[0].vt = VT_UNKNOWN) & Assign (dispparams.rgvarg[0].ulVal))
    {
    hresult = IUnknown(dispparams.rgvarg[0].pdispVal).QueryInterface(IID_IDispatch, Image1->Picture);
    }
    else
    {
    hresult = E_NOINTERFACE;
    }

Discussions similaires

  1. Problème d'acquisition d'une image vidéo avec OpenCV
    Par erwangouyette dans le forum C++
    Réponses: 0
    Dernier message: 22/08/2008, 20h28
  2. acquisition d'une image au format bitmap puis pgm
    Par MzelleBatz dans le forum Traitement d'images
    Réponses: 1
    Dernier message: 25/02/2008, 16h50
  3. Capturer une image WebCam?
    Par gui38 dans le forum Flex
    Réponses: 2
    Dernier message: 22/08/2007, 17h28
  4. aide sur une image
    Par laetus dans le forum IHM
    Réponses: 5
    Dernier message: 04/10/2004, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo