Parameter nicht im Gültigkeitsbereich



  • Hallo,
    versuche via OpenCV eine Kameradetektierung inkl. Client-Server Anwendung.
    Das Programm steht soweit, nur hatte ich jetzt versucht meine Cam zu starten.

    class Cam
    {
          //start WebCam
          int startCam(int WebCam)
          {
          CvCapture* capture =0;
          capture = cvCaptureFromCAM(0);
          if(!capture)
            {
                cout << "Error: capture is NULL!" << endl;
                return -1;
            }
          }
    };
    
    using namespace std;
    
    Position getCoordinates(CvScalar lower, CvScalar upper)
    {  
        Cam control;
        Cam startCam(int);
        IplImage* frame=0;
        //frame = cvLoadImage("/home/ubuntu/Bilder/Baelle.jpeg");
        frame = cvQueryFrame(capture);
        if(!frame)
        //return -1;
    
        cout << "Error" << endl;
        control.imgTracking=cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U, 3);   //create a blank image and assigned to 'imgTracking' which has the same size of original video
        cvZero(control.imgTracking);...
    

    Mein Problem ist nun, dass capture nicht im Gültigkeitsbereich definiert ist. bin noch recht am Anfang meiner Programmierkenntnisse. Ich übergebe in meiner Funktion startCam den Wert von capture oder?und diesen möchte ich dann benutzen um meine Kameradetektion zu starten.
    Freue mich über Hilfe! PS 2. Code ist nur ein Ausschnitt.



  • CvCapture* capture = 0;
    

    Hiermit legst du in 'startCam' eine neue lokale Variable an (auf die du dann aber von außen keinen Zugriff hast).

    Und diese Klassenfunktion mußt du dann auch richtig aufrufen:

    Cam control;
    
    int webCam = 0; // or whatever
    control.startCam(webCam);
    


  • Ingenieurin schrieb:

    Mein Problem ist nun, dass capture nicht im Gültigkeitsbereich definiert ist.

    Das ist vielleicht ein Fehler, den der Compiler dir ausgibt, aber das ist nicht dein Problem im eigentlichen Sinne. Dein Problem ist, dass das Programm überhaupt keinen Sinn ergibt. Zumindest keinen, den ich erkennen kann. Somit ist es auch nicht möglich, das zu reparieren.

    Es sieht außerdem so aus, als würdest du zuviele Schritte auf einmal gehen wollen. Wenn du noch nichtmal mit Variablen, Funktionen und Gültigkeitsbereichen vertraut bist, solltest du erstmal keine Klassen schreiben.



  • Cam startCam(int);
    

    Das ist kein Methodenaufruf, das ist eine Deklaration. Du musst einen int übergeben, entweder direkt oder als Variable.

    Soll "capture" eine Membervariable von "Cam" sein? Wenn nicht, dann könntest du den von "cvCaptureFromCAM" erstellten Pointer (btw. muss der Pointer eigentlich manuell gelöscht werden?) von der Methode zurückgeben lassen. Im Fehlerfall wirfst du dann eine Exception, anstelle den Rückgabewert zum Transport des Fehlercodes zu missbrauchen.

    Ich weiß nicht genau, was "CvScalar" für ein Typ ist, ber vermutlich ist es besser, den als (const) Referenz zu übergeben:

    Position getCoordinates(const CvScalar& lower, const CvScalar& upper)
    


  • Die Klasse Cam macht so keinen Sinn. Du definierst darin überhaupt keine Datenelemente, in denen du dir irgend einen Zustand merken könntest. Die Variable namens capture definierst du nur funktionslokal in der startCam-funktion. Wenn die Ausführung mit der Funktion fertig ist, verschwindet diese Variable wieder und das erzeugt dann ein Resourcen-Leck.

    Cam control;
    Cam startCam(int);
    

    macht auch sicher nicht das, was Du willst. Du definierst hier ein Cam -Objekt namens control , rufst dann aber nicht die startCam-Funktion auf, sondern deklarierst hier nur eine Funktion, die ein int nimmt und ein Cam-Objekt zurück gibt. Der Funktionsaufruf hätte so aussehen müssen:

    int ergebnis = control.startCam(dieWebCam);
    

    wobei dieWebCam dann irgendein int ist. Aber wie gesagt, so bringt das auch nichts, weil es capture nur innerhalb der startCam-Funktion gibt.

    Du müsstest Dich bzgl. der C++ Basics mal schlauer machen. Ohne ein bisschen Grundwissen tappst du ja doch nur im Dunkeln. Helfenden macht das auch nur viel Arbeit, wenn sie Dir erst mal so viele Basics beibringen müssen. Da kannst du nicht drauf setzen, dass immer einer da ist, der Dir für lau Händchen hält.

    Vorschlag:

    // Das hier kommt in eine Header-Datei
    class Cam
    {
    public:
        explicit Cam(int index);
        IplImage* queryFrame();
        ~Cam();
    private:
        CvCapture* cvc;
    
        Cam(Cam const&); // nicht kopierbar
        Cam& operator=(Cam const&); // nicht zuweisbar
    };
    
    // Das hier kommt in eine cpp-Datei
    Cam::Cam(int index)
    : cvc(cvCapture(index))
    {
        if (!war_alles_in_ordnung(cvc))
            throw std::runtime_error("camera will nicht!");
    }
    
    IplImage* Cam::queryFrame()
    {
        return cvQueryFrame(capture);
    }
    
    Cam::~Cam()
    {
        cvReleaseCapture(&cvc);
    }
    

    (ungetestet)
    oder so ähnlich.



  • Die OpenCV API sieht ja schon gräßlich aus. Gibt's da keinen vernünftigen C++ Wrapper (so mit RAII und so) für? Diese ganzen cvReleaseXXX-Funktionen sind ja schon nicht mehr feierlich. Oder habe ich das nur übersehen?

    Gut, ab C++11 könnte man für fast alles da auch std::unique_ptr verwenden.


Anmelden zum Antworten