я пытаюсь сделать видео-окон:
показывает все кадры из видео, а также некоторые изображения из каждого кадра. Это вспомогательное изображение может изменить размер и быть взятым из другого положения исходного кадра.
Итак, код, который я написал, делает в основном это:
- cvQueryFrame , чтобы получить новое изображение из видео
- Создание нового IplImage (img) с размерами подизображения (window.height, window.width)
- Создание нового Cvmat (мат) с размерами подизображения (window.height, window.width)
- CvGetSubRect (originalImage, mat, window) захватывает фрагмент изображения
- преобразовать Mat (cvMat) в img (IplImage), используя cvGetImage
моя проблема в том, что для каждого кадра я создаю новые IplImage и cvMat, которые занимают много памяти, и когда я пытаюсь освободить выделенную память, я получаю ошибку сегментации, или в случае CvMat выделенное пространство не освобождается (Вальгринд продолжает говорить мне, что он определенно потерял место).
следующий код делает это:
int
main(void){
CvCapture* capture;
CvRect window;
CvMat * tmp;
//window size
window.x=0;window.y=0;window.height=100;window.width=100;
IplImage * src=NULL,*bk=NULL,* sub=NULL;
capture=cvCreateFileCapture( "somevideo.wmv");
while((src=cvQueryFrame(capture))!=NULL){
cvShowImage("common",src);
//get sub-image
sub=cvCreateImage(cvSize(window.height,window.width),8,3);
tmp =cvCreateMat(window.height, window.width,CV_8UC1);
cvGetSubRect(src, tmp , window);
sub=cvGetImage(tmp, sub);
cvShowImage("Window",sub);
//free space
if(bk!=NULL)
cvReleaseImage(&bk);
bk=sub;
cvReleaseMat(&tmp);
cvWaitKey(20);
//window dimensions changes
window.width++;
window.height++;
}
}
cvReleaseMat (& TMP) ; кажется, не влияет на общее количество потерянной памяти, valgrind сообщает о том же количестве «точно потерянной» памяти, если я комментирую или раскомментирую эту строку.
cvReleaseImage (& bk); вызывает ошибку сегментации. обратите внимание, я пытаюсь освободить предыдущий субкадр, который я копирую в переменную bk. Если я прокомментирую эту строку, программа будет работать гладко, но с большим количеством утечек памяти
Я использую Ubuntu 9.10 с OpenCV 2.0.
Мне действительно нужно избавиться от утечек памяти,
Может ли кто-нибудь объяснить мне, как исправить это или даже лучше, как правильно выполнять оконные изображения?
Спасибо