簡體   English   中英

OpenCV cv :: Mat使用std :: vector導致潛在的內存泄漏

[英]OpenCV cv::Mat causing potential memory leak with std::vector

就目前而言,我試圖以cv :: Mat的形式將圖像的整個列表保存在向量中,以供以后處理。 現在,我有這樣的東西:

do
{
 image = readimage();
 cv::Mat mat = cv::Mat((length, width, CV_8UC4, image));
 cv::Mat temp = mat.clone();
 saved_images.push_back();

 mat.release();
 temp.release();
 freeimagememory(image);
}
while(hasimage);

這實際上有效。 對於非常小的圖像列表,它將很好地存儲它們。 但是,當我得到大量圖像時,該程序始終崩潰,並說Abort()被調用,並且在檢查時它說它拋出了cv :: exception。

有人知道為什么是這樣嗎? 我曾考慮過將向量更改為指向cv :: Mat的指針的向量,以節省空間(克隆似乎很昂貴),但我不確定這樣做的效果如何。

有人可以幫忙嗎?

EDIT1:引發的確切錯誤未能分配X字節。 我認為這是因為它以某種方式吞噬了所有可用的內存(即使我坐在8G的內存上並且肯定有可用的內存)。

EDIT2:

下面的代碼似乎也有效。

std::vector<cv::Mat*> ptrvec;
do{

 image.readimage();
 ptrvec.push_back(new cv::Mat((length, width, CV_8UC4, image)));
 freeimagememory(image);
}
while(hasimage);

這個內存沒有問題(我可以將所有想要的圖像推送到其中),但是在嘗試執行此操作時遇到訪問沖突

cv::imshow("Test Window", *ptrvec[0]);

EDIT3:

我是否有機會達到32位的上限? 我具有將其重新編譯為64位項目的能力。

當您在向量中存儲3000 x 800 x 600彩色圖像時,可能內存不足。 將Mat指針存儲在內存中不會解決您的問題,因為數據仍然分配在RAM中。

檢查系統中是否有足夠的內存來存儲所有圖像。 如果不是,則可以批量上傳圖像,例如,處理前500張圖像,然后處理接下來的500張圖像,依此類推。

在程序中,將向量分配到堆棧上 當您需要大量內存(根據您的情況)時,建議在堆上分配。 因此,可以嘗試在堆上分配向量(前提是您有足夠的內存來存儲向量)。 有關更多信息,請參見stack vsheap此cpp-tutorial

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM