Webcam Auflösung



  • Hallo,

    ich beschäftige mich momentan mit dem Webcam Programm von http://www.cppb.allanpetersen.com/software.htm . Diese Programm arbeitet mit der WinAPI. Ich habe es schon so verändert, dass durch einen Timer alle 10sek ein Bild geschossen wird, was in einem anderen Programm weiterverarbeitet wird.

    Leider bekomme ich es nicht hin, die Auflösung der Webcam zu ändern. Ich möchte diese fest auf 640x480 stellen. Die Webcam-Aufnahme startet jedoch immer auf 320x240. Meine Cam kann Auflösungen von 640x480 darstellen.

    Ich arbeite mit dem Borland C++Builder

    Auf Wunsch kann ich auch den Quelltext posten. Dieser ist jedoch noch fast wie auf der oben genannten Homepage vorhanden.

    Durch Nachforschungen hier im Forum bin ich schon auf die capSetVideoFormat Funktion gestoßen. Diese wird in
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-116057-and-view-is-next.html
    und
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_capsetvideoformat.asp
    beschrieben.

    Leider bin ich neu in WinAPI und versteh leider nicht, was das für Argumente sind, die die Funktion braucht. Kann mir das bitte jemand erklären? Lese die Seiten jetzt schon seit Minuten durch und verstehe nur Bahnhof. 😞



  • Kann mir keiner helfen? Das wäre echt wichtig, weil ich die Funktion für ein Projekt brauche, das auf 640x480 ausgelegt ist... 😞



  • So learning bei doing.

    Hab mir im Netz ein bisschen was zusammengesucht und auf diese Weiße verwirklicht:

    //Die Standarteinstellungen laden
    DWORD dwSize;
    BITMAPINFO *pbiInfo;

    dwSize=capGetVideoFormatSize(hwndVideo);

    capGetVideoFormat(hwndVideo, pbiInfo, dwSize);

    // Einstellen der neuen Werte
    DWORD dwWidth,dwHeight,dwBPP;
    char *svWidth,*svHeight,*svBPP;

    dwWidth=640;
    dwHeight=480;
    dwBPP=16;

    pbiInfo->bmiHeader.biWidth = dwWidth;
    pbiInfo->bmiHeader.biHeight = dwHeight;
    pbiInfo->bmiHeader.biBitCount = (WORD) dwBPP;

    pbiInfo->bmiHeader.biSizeImage = 0;
    pbiInfo->bmiHeader.biCompression = BI_RGB;
    pbiInfo->bmiHeader.biClrUsed = 0;
    pbiInfo->bmiHeader.biClrImportant = 0;
    pbiInfo->bmiHeader.biPlanes = 1;

    pbiInfo->bmiColors->rgbBlue = 0;
    pbiInfo->bmiColors->rgbGreen = 0;
    pbiInfo->bmiColors->rgbRed = 0;
    pbiInfo->bmiColors->rgbReserved = 0;

    //Zurückschreiben zur API
    capSetVideoFormat(hwndVideo, pbiInfo, dwSize);

    Leider wird das Videofenster immernoch nur in der Auflösung 320x240 angezeigt. Ich dreh langsam durch. 😮



  • Scheinbar ist mein Thema ziemlich uninteressant... 😞

    Hat keiner Ahnung vom Ansprechen einer Webcam mit C++?



  • Bei www.codeproject.com gibt es Wrapperklassen für Webcams. Studiere einfach mal Code von anderen Leuten und gucke wie die das machen.
    Ich weiss von Kollegen, dass oft DirectShow für sowas eingesetzt wird.



  • MSDN schrieb:

    Remarks
    Because video formats are device-specific, applications should check the return value from this function to determine if the format is accepted by the driver.

    Schau mal nach, ob's überhaupt klappt.



  • Ich habs nach langem Rumprobieren jetzt endlich selber geschafft. Trotzdem vielen Dank für die Hilfe!



  • Hi

    Nach den Beträgen bin ich auch auf den Geschmack gekommen meine Webcam zu aktivieren. Könntest den SourceCode posten mit es geklappt hat. 🙂

    Vielen Dank

    Peter



  • Kann ich gern machen. Jedoch ist er, bis auf die Einstellung der Auflösung der selbe wie auf http://www.cppb.allanpetersen.com/software.htm.

    Die Cpp-Datei

    #include <vcl.h>
    #pragma hdrstop
    
    #include <stdio.h>
    #include "c_cap.h"
    #include "Unit6.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;
    
            capCaptureStop(hwndVideo);
            capPreview(hwndVideo, FALSE); // end preview
            capDriverConnect(hwndVideo, SelectedDevice);
            capDriverDisconnect(hwndVideo); // disconnect from driver
            capCaptureAbort(hwndVideo);
    }
    
    //---------------------------------------------------------------------------
    // 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);
    
    //-----------------------------------------------------------------------------
    
    //**********Eigene Veränderungen an dem Header*********************************
    //-----------------------------------------------------------------------------
            //Die Standarteinstellungen laden
    	DWORD dwSize;                                                           // Länge der Formateigenschaften
    	BITMAPINFO pbiInfo;                                                     // Bitmap-Eigenschaften der Datei
    
    	dwSize=capGetVideoFormatSize(hwndVideo);                                // Messen der Länge
    
    	capGetVideoFormat(hwndVideo, &pbiInfo, dwSize);                         // Momentane Formatierung laden
    
    	// Einstellen der neuen Werte
    	DWORD dwWidth,dwHeight,dwBPP;
    
            dwWidth=640;                                                            // Horizontale Auflösung
            dwHeight=480;                                                           // Vertikale Auflösung
            dwBPP=24;                                                               // Farbtiefe
    
    	pbiInfo.bmiHeader.biWidth = dwWidth;
    	pbiInfo.bmiHeader.biHeight = dwHeight;
    	pbiInfo.bmiHeader.biBitCount = (WORD) dwBPP;
    
    	pbiInfo.bmiHeader.biSizeImage = 0;                                      // Größe der reservierten Bytes
    	pbiInfo.bmiHeader.biCompression = BI_RGB;                               // Komprimierung (BI_RGB=keine Kompr.)
    	pbiInfo.bmiHeader.biClrUsed = 0;                                        // Maximale Anzahl der dargestellten
    	pbiInfo.bmiHeader.biClrImportant = 0;                                   // Farben, 0=alle Farben
    	pbiInfo.bmiHeader.biPlanes = 1;                                         // Einstellung der Treiberebenen. Muss 1 sein
    
    	pbiInfo.bmiColors->rgbBlue = 0;                                         // Eingabe der Farbverstärkung der
    	pbiInfo.bmiColors->rgbGreen = 0;                                        // Grundfarben. 0=keine Verstärkung
    	pbiInfo.bmiColors->rgbRed = 0;
    	pbiInfo.bmiColors->rgbReserved = 0;                                     // Muss auf 0 gesetzt sein
    
    	//Zurückschreiben zur API
    	capSetVideoFormat(hwndVideo, &pbiInfo, dwSize);
    //-----------------------------------------------------------------------------
    
            // Die neu eingestellte Bildgröße wird in den CapStatus geladen
            capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));
    
            hsize = GetSystemMetrics(SM_CYMENU);
            hsize += GetSystemMetrics(SM_CYCAPTION);
    
            // Das Anzeigefenster wird neu aufgebaut
            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);
    
            // Stellt die Bildwiederholrate des Vorschaufensters ein
            capPreviewRate (hwndVideo, 33.3);
    
            // startet die Bildvorschau
            capPreview (hwndVideo, TRUE);
    
            // Das geöffnete Aufnahmegerät wird gespeichert
            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);
    }
    //---------------------------------------------------------------------------
    

    Der Header

    //---------------------------------------------------------------------------
    
    #ifndef c_capH
    #define c_capH
    //---------------------------------------------------------------------------
    #include <vfw.h> // video for windows library
    
    class TCap
    {
    private:
    
    protected:
        HWND ParentHandle;
        HWND hwndVideo;
        CAPDRIVERCAPS CapDrvCaps; // driver capabilities
    
        int     SelectedDevice;
    
    public:
        TStringList     *pStringCapDrivers;
        int EnumCapDrv();
        void Connect (int Selected);
        void Format ();
        void Source ();
        void CaptureFrame (char *FileName);
      __fastcall TCap(HWND Handle);
      __fastcall ~TCap();
    };
    
    #endif
    


  • an der unit datei hast du nichts geändert? Meine heißt nämlich Unit1.h/.cpp
    wie machst du denn damit nun ein Bild, wenn du nicht die GUI benutzt?
    Ist es möglich das Bild direct als 2d-array zu erhalten(jedes Element ist ein Pixel mit den Farb(bzw Grauwerten))???
    ich wollte nämlich ne console app machen die alle 0.x sekunden ein bild in den arbeitsspeicher schreibt und mit bildpunktarrays(grauwerte) nen bischen rumrechnet.

    z.B.:
    mache referenzbild lade in array.
    mache bild lade in array.
    bilde die differenz.
    rechne die veränderte fläche aus.



  • [gelöscht wegen Unsinn]


Anmelden zum Antworten