[英]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.