Matchtemplate per Videofile?



  • Hallo Leute

    ich habe ein Program, das mittels OpenCV Funktionen ein Bild einliest verarbeitet und das Eingangsbild an einer stelle markiert (Markierung wird mittels Rectangle eingezeichnet) wieder ausgibt.
    Jetzt wäre mein nächster Schritt das Program so zu ändern das statt einem Bild ein ganzes Video eingelesen wird.
    Zuerst möchte ich das mit einer Videofile machen, da später das Program per Videostream gefüttert werden soll. Die berechnung um die Position für das Rectangle zu finden dauert um die 3ms welches ich mit QueryPerformanceCounter getestet habe. Ich denke das müsste genügen um das Program in Echtzeit zum laufen zu bringen.

    Mit welchen Funktionen könnte ich das angehen? Wäre für Tips dankbar!

    Viele Grüße
    Hilbert


  • Administrator

    Da OpenCV ziemlich wenig mit C# oder .Net zu tun hat, verschiebe ich dich mal in "Rund um die Programmierung". Dort dürfte die Chance grösser sein, Hilfe zu bekommen.

    Grüssli



  • Dieser Thread wurde von Moderator/in Dravere aus dem Forum C# und .NET in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ein Video mittels OpenCV einzulesen ist pippieinfach: http://opencv.willowgarage.com/documentation/cpp/reading_and_writing_images_and_video.html#videocapture

    Den Rest deines Codes solltest du ja eh uebernehmen koennen.



  • Hi Leute

    bin jetzt endlich mal dran gehockt an mein problem und habe es so implementiert das ich statt einem Video einen Videostream aus einer Webcam lese. Mein Such algorithmus funktioniert auch gut findet auch dann immer was im Bild, markiert es auch mit DrawFoundTargets aber löscht das rectangle dann nicht dannach! Wie lösche ich das Rectangle wieder? Ich hab dann lauter Rectangles im Bild 😞

    //endlos schleife für Webcam
    for(;;)
        {
    
    // Such algorithmus
        Mat colorImage;
    
     if(source.channels() == 1)
        {
            cvtColor(source, colorImage, CV_GRAY2RGB);
        }
        else
        {
            colorImage = source.clone();
        }
    
        DrawFoundTargets(&colorImage,
                         target.size(),
                         foundPointsList,
                         confidencesList);
    
             imshow("Results", colorImage);
            if(waitKey(20) >= 0) break;
        }
    
        return 0;
    


  • leg eine KOpie des bildes an und zeichne das Rectangle in die Kopie, stell dann die Kopie dar.



  • das mache ich doch habe diesen Teil des Codes vergessen einzufügen!
    Also eine kopie lege ich an, kann man dann denn speicher nicht wieder frei geben? oder habe ich einen denk fehler?



  • Der Dtor wird automatisch aufgerufen, der Speicher also auch freigegeben.

    Was genau meinst du mit "wie loesche ich das Rectangle wieder". In dem Code, den du JETZT gepostet hast, sollte in jedem Bild nur das 1 Rectangle drin sein, das du da auch reingezeichnet hast, oder nicht? (ich weiss nicht genau was cvtColor macht und bin zu faul nachzuschauen, aber ich geh mal davon aus dass ist auch eine "Bild kopieren"-Funktion)



  • Hallo

    also das Problem momentan ist das wenn ein Rectangle einmal gezeichnet wird er immer im Bild bleibt. Was ich will ist das das Rectangle immer Frame für frame gezeichnet werden soll. Und dabei soll das Rectangle vom vorherigen Frame nicht mehr im Bild bleiben. Es geht ja um tracking von objecten im Videostream.

    cvtColor convertiert nur den Farbbereich in einen anderen.



  • Dann zeig bitte mal den kompletten Code.



  • #include "stdafx.h"
    #include "cv.h"
    #include "highgui.h"
    #include "FastMatchTemplate.h"
    
    using namespace cv;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	VideoCapture cap(0); // open the default camera
        if(!cap.isOpened())  // check if we succeeded
            return -1;
     // perform the match
        vector<Point> foundPointsList;
        vector<double> confidencesList;
    
        Mat target = imread("temp.jpg");
    
    	imshow("Results", target);
    	if(!target.data)
        {
            printf("\nERROR: Could not load image .\n");
            return 2;
        }
    // in der Scheife werden alle frames der Webcam berechnet
        for(;;)
        {
            Mat source;
            cap >> source; // get a new frame from camera
    		  FastMatchTemplate(source,target,&foundPointsList,&confidencesList);
    
    	Mat colorImage;
    
        // if the original is a grayscale image, convert it to color
        if(source.channels() == 1)
        {
            cvtColor(source, colorImage, CV_GRAY2RGB);
        }
        else
        {
            colorImage = source.clone();
        }
    Mat copy = source;
    //zeichne das Rectangle ins bild
        DrawFoundTargets(&copy,
                         target.size(),
                         foundPointsList,
                         confidencesList);
    
             imshow("Results", copy);
    
            if(waitKey(50) >= 0) break;
        }
        // the camera will be deinitialized automatically in VideoCapture destructor
        return 0;
    }
    


  • alles klar habe den fehler gefunden. Es lag daran das die gefundenen Punkte in einem Vector gespeichert wurde diesen vecotor musste ich wieder mit clear leer in der Schleife! Und schwups siehe da es geht 🙂

    foundPointsList.clear();
    	confidencesList.clear();
    

Anmelden zum Antworten