Een gericht object kopiëren met OpenCV

Ik ben niet echt een C ++ -programmeur, meer gewend aan C# en Java, waar je je geen zorgen hoeft te maken over aanwijzers. I dacht ik begreep wat ik hier aan het doen was, maar de resultaten waren niet wat ik verwachtte en ik weet niet zeker of ik hier iets stoms doe of ergens anders in de programma veroorzaakt problemen.

Hoe dan ook, ik werk met OpenCV en ik heb twee afbeeldingen, die ik als volgt initialiseer:

IplImage *current_frame = NULL;
IplImage *previous_frame = NULL;

Dan heb ik dit codeblok:

if (current_frame != NULL)
    {
        previous_frame = new IplImage(*current_frame);
        current_frame = cvQueryFrame( capture );
    }
    else
    {
        current_frame = cvQueryFrame( capture );
        previous_frame = cvQueryFrame( capture );
    }

Het idee is dat de eerste keer dat de code wordt uitgevoerd, zowel de huidige als de vorige frames de vers opgenomen afbeelding zullen gebruiken, maar dat voor de volgende frames het vorige frame de vorige waarde van current_frame zal aannemen en dat current_frame een nieuwe afbeelding vastlegt (ik ben er doorheen gegaan) de code en het gaat naar de juiste takken van de if-statement).

Wat er feitelijk gebeurt, is dat ik beide frames uitvoer en dat ze identiek zijn, in plaats van dat vorige_frame er achter blijft zoals ik dat wil.

Gebruik ik de wijzers verkeerd? Zo ja, hoe moet ik gaan om het gewenste gedrag te krijgen? Of lijkt het erop dat het moet doen wat ik wil?

Bedankt.

2

1 antwoord

I suspect you are using the raw C API: here IplImage is defined as a POD struct

typedef struct _IplImage
{
 //...
    char *imageData;
 //...
}
IplImage;

Zoals u ziet, kopieert het nieuwe IplImage (* current_frame) alleen aanwijzers (met name imageData </​​code>), niet de daadwerkelijke gegevens. Dus je deelt de gegevens in beide afbeeldingen fout.

I suggest you read here for the C++ wrappers, and especially how to use them for memory management: http://opencv.willowgarage.com/documentation/cpp/memory_management.html

EDIT If you want to use the C API:

currFrame = cvQueryFrame( cap );

// Clone the frame to have an identically sized and typed copy
prevFrame  = cvCloneImage( currFrame );
1
toegevoegd
stuitte op de C API manier om dit te doen vanuit deze gelijkaardige vraag: stackoverflow.com/questions/4567188/…
toegevoegd de auteur sehe, de bron
Dat cvCloneImage doet precies wat ik probeerde te doen, bedankt! Ik zie ook nu waarom ik dom aan het doen was, dus ook daarvoor bedankt!
toegevoegd de auteur Diarmuid Ó Muirgheasa, de bron