Opencv; Comment gratuit IplImage*?
Je suis en train d'essayer d'obtenir un blocage de OpenCV. Pour le moment, je suis en train de la soustraction de deux images les uns des autres et d'afficher le résultat. J'ai trouvé un exemple de code qui fera l'amende juste.
Mon problème est que j'obtiens une erreur d'allocation de mémoire.
Eh bien, rien de spécial à ce sujet, parce que je suis l'alimentation le programme avec la vidéo HD.
Donc ma question est comment puis-je libérer la mémoire allouée à un IplImage*?
Le Tapis de type a quelque chose comme Tapis.release().
IplImage n'en a pas, ni ne gratuit(IplImage) de travail.
Voici mon code:
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\highgui\highgui_c.h>
using namespace cv;
int main()
{
std::string videofilename;
std::cout << "Please specify the video name (make sure it is in the same folder\nas the application!):" << std::endl;
std::cin >> videofilename;
std::cout << "The name you provided: " << videofilename << std::endl;
VideoCapture video(videofilename);
if(!video.isOpened())
{
std::cout << "Could not open video file" << std::endl;
return -1;
}
std::cout << "Number of frames: " << video.get(CV_CAP_PROP_FRAME_COUNT) << std::endl;
std::cout << "Duration: "<< static_cast<int>(video.get(CV_CAP_PROP_FRAME_COUNT))/(30*60) << "min " << static_cast<int>((video.get(CV_CAP_PROP_FRAME_COUNT)))%(30*60)/30 << "sek" << std::endl;
//Close it before opening for playing
video.release();
CvCapture* capture = cvCaptureFromAVI(videofilename.c_str());
IplImage* frame = cvQueryFrame(capture);
IplImage* currframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
IplImage* destframe = cvCreateImage(cvGetSize(frame),IPL_DEPTH_8U,3);
if ( !capture )
{
std::cout << "Could not open video file" << std::endl;
return -1;
}
cvNamedWindow("dest", CV_WINDOW_AUTOSIZE);
while(1)
{
frame = cvQueryFrame(capture);
if(!frame)
{
printf("Capture Finished\n");
break;
}
currframe = cvCloneImage(frame); //copy frame to current
frame = cvQueryFrame(capture); //grab frame
if(!frame)
{
printf("Capture Finished\n");
break;
}
cvSub(frame, currframe, destframe); //subtraction between the last frame to cur
cvShowImage("dest", destframe);
//cvReleaseImage(currframe); //doesn't work
//free(currframe); //doesnt work either
//delete(currframe); //again, no luck
cvWaitKey(30);
}
cvDestroyWindow("dest");
cvReleaseCapture(&capture);
return 0;
}
- s'il vous plaît éviter IplImages, cv* fonctions, l'ensemble obsolètes c-api. vous avez déjà ouvert un VideoCapture avec succès, maintenant, allez l'utiliser.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez libérer de l'
IplImage
à l'aide decvReleaseImage
. Il prend l'adresse d'un pointeur vers unIplImage
, c'est à direIplImage**
comme argument, de sorte que vous avez à faire cela:au lieu de
cvReleaseImage(currframe);
.Mais gardez à l'esprit, l'image renvoyée par
cvQueryFrame
, (frame
dans votre cas) est un cas particulier et il ne doit pas être publié ou modifié. Aussi, vous n'avez pas à préallouercurrFrame
si vous allez à l'initialiser à l'aide decvCloneImage
finalement.Le code final devrait ressembler à ceci:
CvCapture
. Ainsi, lorsque nous interroger une nouvelle image, la même mémoire tampon est utilisée plutôt que la nouvelle allocation de la mémoire.Utilisation
cvReleaseImage()
. Par exemple, si vous voulez libérerIplImage* frame
, utilisezcvReleaseImage(&frame)
.Pour
Mat
, vous n'avez pas besoin de libérer explicitement. Il publiera automatiquement lors de son bloc de code.Modifier: jetez un oeil à ici sur plus de détails sur
cvReleaseImage()
, qui porte sur certains mauvais libérant les situations.