kleines Prob mit USB Cam unter BCB



  • Hi ich habe ein code im netz gefunden, um eine verbindung zu einer USB Wbcam mit dem BCB zu erstellen:

    #include <vcl.h>
    #pragma hdrstop
    
    #include <stdio.h>
    #include "c_cap.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    
    __fastcall TCap::TCap (HWND Handle)
    {
        // create video capture window
        ParentHandle = Handle;
        hwndVideo = capCreateCaptureWindow(
                        (LPSTR) "My Capture Window",
                        WS_CHILD | WS_VISIBLE,
                        0, 0, 300, 200,
                        (HWND) Handle,
                        (int) 1);
    
        pStringCapDrivers = new TStringList;
        SelectedDevice = -1;
    }
    
    __fastcall TCap::~TCap ()
    {
    
        delete pStringCapDrivers;
    
        capPreview(hwndVideo, FALSE); // end preview
        capDriverConnect(hwndVideo, SelectedDevice);
        capDriverDisconnect(hwndVideo); // disconnect from driver
    }
    
    //---------------------------------------------------------------------------
    // enumerate the installed capture drivers
    //---------------------------------------------------------------------------
    int TCap::EnumCapDrv ()
    {
        char szDeviceName[80]; // driver name
        char szDeviceVersion[80]; // driver version
        char str[161]; // concatinated string
        int xcap; // counter
    
        xcap = 0;
        pStringCapDrivers->Clear ();
        do  {
            if (capGetDriverDescription(xcap, szDeviceName, sizeof(szDeviceName),
                                        szDeviceVersion, sizeof(szDeviceVersion))){
    
                sprintf (str, "%s, %s", szDeviceName, szDeviceVersion);
                pStringCapDrivers->AddObject (str, (TObject *)xcap);
                }
            else {
                break;
                }
            xcap++;
            } while (true);
    
        return 0;
    }
    
    //---------------------------------------------------------------------------
    //  connecting to selected device and starts preview
    //---------------------------------------------------------------------------
    void TCap::Connect (int Selected)
    {
        CAPSTATUS CapStatus;
        int       hsize;
    
          // capDlgVideoDisplay(hwndVideo);
          // connect to the driver
        if (SelectedDevice != -1) {
            capPreview (hwndVideo, FALSE);
            capDriverConnect(hwndVideo, SelectedDevice);
            }
    
        if (!capDriverConnect(hwndVideo, Selected)) {
            // ---- Unable to connect to driver
            return;
            }
    
        // update the driver capabilities
        capDriverGetCaps (hwndVideo, sizeof(CAPDRIVERCAPS), &CapDrvCaps);
    
        capDlgVideoFormat(ParentHandle);
    
        // Are there new image dimensions
        capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
    
        hsize = GetSystemMetrics(SM_CYMENU);
        hsize += GetSystemMetrics(SM_CYCAPTION);
    
        // ---- Rescaling the windows
        SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
                    CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
        SetWindowPos(ParentHandle, NULL, 0, hsize, CapStatus.uiImageWidth,
                    CapStatus.uiImageHeight+hsize, SWP_NOZORDER | SWP_NOMOVE);
    
        // set preview rate to 33.3 miliseconds, or 30 FPS
        capPreviewRate (hwndVideo, 33.3);
    
        // start preview video
        capPreview (hwndVideo, TRUE);
    
        // ---- Remember selected device
        SelectedDevice = Selected;
    }
    
    //---------------------------------------------------------------------------
    //  Get access to the video source format box
    //---------------------------------------------------------------------------
    void TCap::Format ()
    {
        int       hsize;
    
        CAPSTATUS CapStatus;
    
        capDlgVideoFormat(hwndVideo);
        // Are there new image dimensions
        capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
    
        hsize = GetSystemMetrics(SM_CYMENU);
        hsize += GetSystemMetrics(SM_CYCAPTION);
    
        SetWindowPos(ParentHandle, NULL, 0, hsize, CapStatus.uiImageWidth,
                    CapStatus.uiImageHeight+hsize, SWP_NOZORDER | SWP_NOMOVE);
        SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
                    CapStatus.uiImageHeight, SWP_NOZORDER | SWP_NOMOVE);
    }
    //---------------------------------------------------------------------------
    //  Get access to the video source dialog box
    //---------------------------------------------------------------------------
    void TCap::Source ()
    {
        capDlgVideoSource(hwndVideo);
    }
    
    //---------------------------------------------------------------------------
    //  capture a frame and save it
    //---------------------------------------------------------------------------
    void TCap::CaptureFrame (char *FileName)
    {
        capFileSaveDIB (hwndVideo, FileName);
    }
    

    Das funzt auch soweit. Ich möchte aber, dass dieses Videobild innerhalb eines Formulares erscheint. Wenn ich aber einen Button z.B. hinzufüge, wird er nach dem compilieren "ignoriert", wieder erscheint nur das Videofenster. Ich weiß nicht, wie ich das hinbekommen kann und hoffe auf Eure Hilfe.

    Gruß
    Brego



  • Mach doch für die Buttons usw eine neue Form... Bzw. eine Form für dein Programm und eine neue Form für dein Video. Dann hast du dein Videobild in einem
    verschiebbaren und scalierbaren Fenster in deinem Programm, ist doch nicht schlecht...



  • Na ich nehm mal an (ohne den ganzen Code jetzt gelesen zu haben) das das Bild der WEbcam direkt auf das FEnster gezeichnet wird. DAmit wäre dein Button schon noch vorhanden nur eben unter dem Bild.



  • @<ente> ich hab ein neues form erstellt. hat so leider nicht gefunzt. es ist nur das neue form erschienen. hab ich was falsch gemacht?

    @Bigwill sowas habe ich mir wohl auch gedacht, aber noch keine Lösung.

    habt ihr noch ne idde. kann man das auf dem form auch mit nem timage machen? hab aber leider keinen plan, wie ich dann das bild dort reinbekomme

    brego



  • falls noch Interess besteht, einfach z.B. ein TPanel-Object in das
    Formular einfügen und den Handle vom Panel-Objekt übergeben . dann
    wird das Videobild nur im Panel-Objekt dargestellt und nicht auf der
    ganzen Form

    mfg



  • Mal wieder nach oben kram und abstaub! *pust*

    Also ich stehe 3,5 Jahre nach diesem Beitrag vor dem selben Problem. Ich habe den selben Programmteil und möchte das Bild gern in einem TImage anzeigen lassen. Das Anzeigen funktioniert ja mit dem capPreview. Leider hab ich nix gefunden, wie ich da ein anderes Anzeigeformat einstellen kann.

    Hat da jemand ne Ahnung?



  • Hi Schmuech,
    also ich habe seit 1 Jahr das selbe Problem und ich bin der meinung das man die WebCam nicht direkt in einen Image öffnen kann auch nicht mit CapPreview so das man einen anderen Treiber nur benutzt.
    Ich versuche die ganze Zeit schon ein Transparentes Fadenkreuz Pic auf das Digicam Bild zu produzieren so das ich einen gewissen punkt fest anjustieren kann und meine WebCam dann über einer Schritmotor Steuerung nachführt.
    Vielleicht weiß ja einer Hilfe ,nur Funktionieren muß es ja den im Handel gibt es ja einige Programme schon dieser art.

    Grüße Olaf aus LE. 😃


Anmelden zum Antworten