Funktion verändert Ausgabe einer früheren Funktion



  • Hallo C++ler

    Ich hatte gerade ein komisches Problem, und nach dem ich grob eine halbe Stunde an dem Post geschrieben habe und immer wieder etwas neues ausprobiert habe, bin ich auch auf eine Lösung gestoßen, verstehe aber das dahinterliegende Problem nicht.

    Das Problem steht unten, die Lösung bestand darin, dass ich in der oberen Funktion die Variable blaBox eingeführt habe und in der zweiten Funktion als parameter benutzt habe. (auskommentierter Teil).
    Ich arbeite noch nicht so lange mit c++ und sehe nicht genau warum meine Lösung funktioniert, es wäre also nett, wenn sich jemand die Zeit nehmen würde und mal drüber schaut.

    Nikolas

    Und hier kommt die ursprüngliche Problem : )

    Hallo

    Ich schreibe an einem kleinen Programm zur Mustererkennung und bin auf ein SEHR merkwürdiges Verhalten gestossen.
    Kurz gefasst suche ich mit Hilfe von openCV nach Ellipsen. Dafür wähle ich zufällig Pixel aus einem Kantenbild, passe eine Ellipse daran an, zeichne die Ellipse ins Bild und bewerte danach die Ellipse, in dem ich die Kantenpunkte zähle, die nahe an der Ellipse liegen.
    Mein Problem ist, dass die Evaluationsfunktion, die NACH dem Zeichnen aufgerufen wird, das Bild verändert.
    Hier vielleicht erstmal der interessante Code:

    int maxTries = 1;
    
    			for (int i=0; i<maxTries; i++) {
    
    				CvScalar f = CV_RGB(0,255,0);
    
    				// Speicherstruktur fuer die Ellipse
    				CvBox2D32f box;
    				CvBox2D32f *p_box = &box;
    
    				CvPoint2D32f pointsForFit[param_cnt_points_selected_for_fit-1];
    
    				// zufaellige Auswahl für Stützpunkte der Ellipse:
    				for (int cnt=0; cnt<param_cnt_points_selected_for_fit;cnt++) {
    					CvPoint2D32f pf = nonBlack[rand()%cntNonBlack];
    					pointsForFit[cnt] = pf; 
    
    				}
    
    // Anpassen einer Ellipse an die Punkte		
    		cvFitEllipse(pointsForFit,param_cnt_points_selected_for_fit, p_box);
    
    				int hits;
    				int* p_hits = &hits;
    				CvPoint2D32f* neighbours;
    
    				// Zeichnen der Ellipse, die in p_box gespeichert ist, auf das Bild "original" 
    				NcvEllipse(original, *p_box, 1, CV_RGB(0,255,0) );
    				// anzeige des Bildes
    				cvShowImage("original", original);
    				cvWaitKey(0);
    
    			/* CvBox2D blaBox;
    				blaBox.center.x=p_box->center.x;
    				blaBox.center.y=p_box->center.y;
    				blaBox.size.width = p_box->size.width;
    				blaBox.size.height = p_box->size.height;
    				blaBox.angle=p_box->angle; */
    // Auswertung der Güte der Ellipse im Bild
    				float value = evaluateEllipse(NULL,/*blaBox*/ *p_box, 10, nonBlack, cntNonBlack,
    				 p_hits, false, false, false, neighbours);
    				cout << "value: " << value << endl;
    
    			}
    

    Wenn ich das evaluateEllipse auskommentiere, wird die Ellipse korrekt eingezeichnet, wenn ich es ausführen lasse, wird zwar eine Ellipse gezeichnet, die nur leider nichts mit der berechneten zu tun hat.

    Hier kommt die evaluateEllipse:

    // Brennpunkte
    	CvPoint C1,C2; 
    
    	// Summe der Abstaende zu den Brennpunkten: (=2*lang)
    	double d;
    
    	// Berechnung der Brennpunkte:
    	getCenters(box, &C1, &C2, &d); // schreibt nicht nach box!
    
    	float dist;
    
    	for (int i=0; i<length;i++) {
    		CvPoint2D32f p = kanten[i];		
    
    		// Berechnung der Abstaende zu den Brennpunkten
    		dist = hypot(p.x-C1.x,p.y-C1.y)+hypot(p.x-C2.x,p.y-C2.y);
    
    		// Absolutbetrag des Fehler zur Ellipse
    		float error = labs(dist-d); 
    
    		// Wenn der Abstand zur Ellipse kleiner als die Toleranz ist, 
    		// wird der Pixel als unter der Ellipse gezählt:
    		if ( error<tolerance)  { 
    			*p_hits = *p_hits+1;
    
    			//	cvSet2D(img, p.y,p.x, CV_RGB(255,255,255));
    
    		}		
    
    	} // Schleife ueber alle KantenPunkte
    
    	// kleine Halbachse: box.size.width/2: sqrt(2*(klein*klein+gros*gros))
    	float umfang = CV_PI*sqrt(2*(box.size.width*box.size.width/4+box.size.width*box.size.width/4));
    
    	return *p_hits/umfang;
    
    }
    

    die unbenutzten Parameter für die Evaluation stammen aus einer älteren Implementation, alle Zeilen, die sie benutzen, sind auskommentiert; ich habe sie hier zur besseren Lesbarkeit weggelassen.


Anmelden zum Antworten