Bild von Webcam mit mehr als 640x480 Pixeln Auflösung in eine Anwendung einbauen



  • Hallo,
    ich möchte eine Anwendung mit C++-Builder schreiben, um ein Webcam-Bild anzuzeigen.
    Greift man relativ einfach auf den Microsoft WDM Image Capture Treiber zu, dann hat man das Problem, dass die Auflösung von maximal 640x480 möglich ist.
    Da ich aber eine Webcam mit 2 MEgapixel (Trust Widescreen HD Webcam 16530) benutze, müsste ich, um die volle Auflösung erhalten zu können, irgendwie anders mir das Bild holen.
    Hat jemand eine Idee? Anmerkung: Die Kamera benötigt keinen Treiber zur Installation.
    Oder gibt es einen "Standardtreiber", auf den man genauso zugreifen kann, wie auf WDM, aber mit höherer Auflösung?



  • Hi

    Kannst sowas alternativ mit der OpenSource library opencv machen.

    http://opencv.willowgarage.com/wiki/

    Dan kannste das etwa so machen ...

    Bsp:
    
    int ShowStreamFromCam(int deviceid ,char *windowname ,double width ,double height ,double fps)
    {
    
    	CvCapture* capture = NULL;
    	IplImage* frame = NULL;
    	char c=0;
    
        capture = cvCaptureFromCAM(deviceid);
        if(!capture) {
            printf("Could not initialize capturing...\n");
            return 1;
        }
    
    	/* Wait until the camera is initialized */
    	Sleep(3000);
    
    	/* Set video options */
    	cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_WIDTH , width);
    	cvSetCaptureProperty(capture ,CV_CAP_PROP_FRAME_HEIGHT , height);
    	cvSetCaptureProperty(capture ,CV_CAP_PROP_FPS , fps);
    
    	/* Set windowname */
    	cvNamedWindow(windowname, 0);
    
    	for(;;) {
    
           frame = cvQueryFrame(capture);
    		if(frame != NULL) {
    			cvShowImage(windowname, frame);
    		} else {
    			printf("QueryFrame failed !");
    		}
    
           c = cvWaitKey(10);
           if(c == 27)
             break;
    	}
    
        cvReleaseCapture(&capture);
        cvDestroyWindow(windowname);
    
    	return 0;
    }
    

    Ps: Mag den Microsoft kramm nicht ...

    lowbyte



  • Ich auch nicht!
    Danke! Dazu habe ich ja schon mal was hier im Forum gelesen. Dachte aber, dass auch hier keine höhere Auflösung möglich sei.



  • Hi

    😉
    Wenn du weitere Fragen zur library hast kannst du gerne fragen...
    Entwickle parallel zu anderen Projekten, eine Object-Detector software (Videoüberwachungs Programm) mit der Opencv lib. Bin entzückt von opencv ,weil es mächtig und open-source ist. 😉

    Quelle : WWW

    OpenCV ist eine quelloffene Programmbibliothek unter BSD-Lizenz. Sie ist für die Programmiersprachen C und C++ geschrieben und enthält Algorithmen für die Bildverarbeitung und maschinelles Sehen. Das CV im Namen steht für Computer Vision. Die Entwicklung der Bibliothek wurde von Intel initiiert und wird heute hauptsächlich von Willow Garage gepflegt. Im September 2006 wurde die Version 1.0 herausgegeben, Ende September 2009 folgte nach längerer Pause die Version 2.0.0, welche die Bezeichnung "Gold" trägt. Die Stärke von OpenCV liegt in ihrer Geschwindigkeit und in der großen Menge der Algorithmen aus neuesten Forschungsergebnissen.

    Die Bibliothek umfasst unter anderem Algorithmen für Gesichtsdetektion, 3D-Funktionalität, Haar-Klassifikatoren, verschiedene sehr schnelle Filter (Sobel, Canny, Gauß) und Funktionen für die Kamerakalibrierung und mehr.

    lowbyte



  • Danke, auf das Angebot werde ich sicher noch öfter zurückkommen.



  • Leider komme ich gar nicht so richtig dazu, endlich das Programm zu erstellen. Nach etlichen Stunden habe ich nun endlich OpenCV-2.1.0-win32-vs2008.exe installiert, daraus die lib-Dateien für den Borland-Builder6 mit "coff2omf" laut opencv-Wiki generiert u. lib- und h-Dateien in Borland-Programmordner kopiert u. die dll-Dateien in den Win-Systemordner kopiert.
    Ergebnis beim Compilieren mit obigem Quellcode ergibt:

    [C++ Fehler] cxcore.hpp(2208): E2028 Der Operator -> muß einen Zeiger oder eine Klasse zurückgeben
      [C++ Fehler] cxoperations.hpp(968): E2015 Mehrdeutigkeit zwischen '_STL::_fm_cos(const _STL::complex<long double> &)' und '_STL::_fm_cos(const _STL::complex<float> &)'
      [C++ Fehler] cxoperations.hpp(969): E2015 Mehrdeutigkeit zwischen '_STL::_fm_sin(const _STL::complex<long double> &)' und '_STL::_fm_sin(const _STL::complex<float> &)'
      [C++ Fehler] cxoperations.hpp(2016): E2028 Der Operator -> muß einen Zeiger oder eine Klasse zurückgeben
      [C++ Fehler] cxmat.hpp(839): E2015 Mehrdeutigkeit zwischen 'Mat::operator MatExpr_<Mat,Mat>() const' und 'MatExpr_<Mat,Mat>::MatExpr_(const Mat &)'
    

    Der 1. Fehler bezieht sich auf die Zeile

    FileNode operator ->() const;
    

    Und nu?



  • Habe alternativ über die Datei opencv_test0.zip (1 MB) von http://www.tetraedre.com/advanced/index.php heruntergeladen, da darin schon alle libs und Headerdateien für BorlandBuilder 6 enthalten sein sollen. Benutze ich diese (in meinem Projektordner) dann bringt mir der Linker die Fehler:

    [Linker Fehler] Unresolved external '_cvCaptureFromCAM' referenced from D:\CAM\UNIT1.OBJ
      [Linker Fehler] Unresolved external '_cvSetCaptureProperty' referenced from D:\CAM\UNIT1.OBJ
      [Linker Fehler] Unresolved external '_cvNamedWindow' referenced from D:\CAM\UNIT1.OBJ
      [Linker Fehler] Unresolved external '_cvQueryFrame' referenced from D:\CAM\UNIT1.OBJ
      [Linker Fehler] Unresolved external '_cvShowImage' referenced from D:\CAM\UNIT1.OBJ
      [Linker Fehler] Unresolved external '_cvWaitKey' referenced from D:\CAM\UNIT1.OBJ
      [Linker Fehler] Unresolved external '_cvReleaseCapture' referenced from D:\CAM\UNIT1.OBJ
      [Linker Fehler] Unresolved external '_cvDestroyWindow' referenced from D:\CAM\UNIT1.OBJ
    


  • Habe es nun geschafft die opencv-Dateien einzubinden (cv097.lib,...). Die aktuellste Version (cv210,...) bekomme ich leider nicht zum Laufen.
    Leider erscheint aber kein Bild, sondern immer "QueryFrame failed !" (vgl. Quellcode oben).
    ???



  • Hi

    Ich benutze VS2008 PRO mit aktuellster SDK, darum kann ich dir leider nicht helfen da ich keine erfahrung mit Borland habe !. Sorry
    Hast du vielleicht ein CodecPack installiert ? Hatte ne menge Probleme bez. OpenCv
    und Codec-Pack's ! Den Grund kannst du dir denken 😃

    Zu den Lib's:

    #include "cv.h"
    #include "highgui.h"

    Diese Header sollten eingebunden sein.

    Und nicht zu vergessen ... die Auflösungen sollten standards entsprechen.

    320x240 - 640x480 - 800x600 - 1024x768 - 1600x1200

    nach diesem Schema, aber das weist du sicher.

    lowbyte



  • Codec pack habe ich, werde ich mal deinstallieren.
    Andere Sache: Evtl. liegt es an der DeviceID.
    Wie kann ich programmieren, dass in einer z.B. Liste angezeigt wird, welche Geräte verfügbar sind, sodass man ein Gerät dort auswählen kann?



  • Funzt, nachdem ich Codecpack deinstalliert und alte Webcamtreiber deinstalliert habe!!! Danke!



  • Leider ändert sich bei mir keine Auflösung u. auch keine Fenstergröße über

    ShowStreamFromCam(-1 ,"LiveWebcam" ,1024 ,768 ,30
    


  • Hi

    Device ID sollte 0 sein ist aber nicht tragisch, da er das erste Device nimmt. Jede weitere angeschlossen Cam had id 1 ,2 ,3 usw.
    Bei meiner Integrierten Webcam läuft alles bis 1024x768 manchmal kann ich sie sogar übersteuern bis 1600x1200 doch dan habe ich ca noch 8 fps. Bei meiner
    Logitech 2 MP Webcam C600 bis 1600x1200 ohne Probleme.

    lowbyte



  • Hi

    Und übertreibe nicht mit den fps. Den ich denke nicht das deine Cam bei 1600x1200 noch 30 fps bringt. Die fps würde ich von Opencv verwalten lassen !

    Dieser wert bringt dir nur wirklich was wenn du zbsp. nur 5 fps willst, aber sonnst wie gesagt von opencv machen lassen. Wäre halt schon nice wenn du die aktuellste lib nehmen könntest.

    lowbyte



  • Welchen fps-Wert muss ich denn übergeben, damit opencv fps selbst verwaltet? 0 ?



  • warum ist das erstellte Fenster bei unterschiedlichen übergebenen Auflösungen immer gleich groß, egal ob cvNamedWindow(windowname, 1); oder cvNamedWindow(windowname, 0); gewählt wurde?
    Wenn ich danach z.B.

    cvResizeWindow(windowname,width+=10,height+=10);
    

    anwende, dann vergrößert sich schlagartig das Fenster auf die Größe, die der anfänglich übergebenen Auflösung entspricht.



  • also mache ich jetzt einfach direkt nach

    cvQueryFrame
    

    ein

    cvResizeWindow(windowname,width,height);
    


  • Wie kann ich meinen frame um einen bestimmten Faktor zoomen (zentriert)?
    Habe bereits mit resize und cvGetRectSubPix experimentiert, aber klappt nicht so.

    gelöst:

    frame_changed = cvCreateImage
                                   ( cvSize(frame->width*100/zoomfaktor ,
                                    frame->height*100/zoomfaktor),
                                    frame->depth, frame->nChannels );
              //Bildauszug aus Frame nehmen u. in frame_changed kopieren, frame_changed enthält gezoomtes Bild
              cvGetRectSubPix(frame, frame_changed, cvPoint2D32f(frame->width/2,frame->height/2));
    


  • Hi

    Das kannst du etwa so machen ...

    int Zooming( struct _IplImage *framesrc ,int zoomvalue ,int rovalue)
    
    	struct _IplImage *dst = NULL;
        float factor;
        float m[6];
        CvMat M = cvMat(2, 3, CV_32F, m);
        int w1 = framesrc->width;
        int h1 = framesrc->height;
    
    	// Erstelle image für zoom
    	dst = cvCreateImage( cvSize(framesrc->width ,framesrc->height), framesrc->depth, framesrc->nChannels );
    
    	// Calculate zoom factor
        factor = (float)(1.0 - ((0.1 * zoomvalue)/8));
    
    	m[0] = (float)(factor*cos((rovalue)*CV_PI/360.));
    	m[1] = (float)(factor*sin((rovalue)*CV_PI/360.));
        m[3] = -m[1];
        m[4] = m[0];
    	m[2] = w1*0.5f;  
        m[5] = h1*0.5f;  
    
        cvGetQuadrangleSubPix( framesrc, dst, &M);
    
    	// Build frame
    	memcpy(framesrc->imageData ,dst->imageData ,dst->imageSize);
    	memcpy(&framesrc->height ,&dst->height ,sizeof(int) );
    	memcpy(&framesrc->width ,&dst->width ,sizeof(int) );
    	memcpy(framesrc->colorModel ,dst->colorModel ,sizeof(char)*4 );
    	memcpy(framesrc->channelSeq ,dst->channelSeq ,sizeof(char)*4 );
    
    	cvReleaseImage(&dst);
    
    	return 0;
    
    }
    

    Wenn es nicht funktionieren sollte sag bescheid.. musste die Funktion aus meinem Project ein bisschen zusammenbastelln, da ich nicht gerade alles hinein stellen wollte.

    Zu den Fps: lass die Anweisung mit fps initialisation einfach weg !

    lowbyte



  • ha, aber mein Code ist etwas kürzer 😉


Anmelden zum Antworten