我想在這裏第一次使用shared_ptr,但我在做這個時遇到了一些麻煩。動態分配每個幀shared_ptr中的圖像
我想每幀獲取IplImage並分配給shared_ptr類成員,釋放最後一張圖像。這是這樣的:
class Detector {
public:
void Detector::updateImage {
main_image_.reset(cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3));
}
private:
boost::shared_ptr<IplImage> main_image_;
}
我在循環中調用updateImage。 cvCreateImage爲該圖像大小動態分配一些內存。
第一次循環運行時,一切正常。現在,第二次出現_BLOCK_TYPE_IS_VALID斷言錯誤。這發生在shared_ptr試圖刪除指針時。
因此,假設我是做了錯事,我試過很多其他選項,如:
if (!main_image_)
main_image_ = boost::shared_ptr<IplImage> (cvCreateImage...
else
main_image_.reset(cvCreateImage...)
也沒工作。先嚐試重置shared_ptr,也沒有工作。嘗試設置一個新的臨時shared_ptr並分配給我的main_image_ ptr。沒有成功。
我在哪裏錯了?使用常規指針並手動釋放圖像就像魅力一樣工作。
由於提前,
西奧
「IplImage」和「cvCreateImage()」的定義是什麼? – 2011-03-05 00:56:08
這與您的'shared_ptr'問題無關,但我想指出,爲每個幀分配640x480圖像對我來說似乎效率很低。您可能要考慮重新使用已分配的圖像。檢查一種稱爲「雙緩衝」的技術(http://en.wikipedia.org/wiki/Multiple_buffering#Double_buffering_in_computer_graphics)。 – 2011-03-06 15:46:47
@Maxim。 IplImage是OpenCV中使用的一種結構。它保存圖像的數據和元數據。 cvCreateImage也是OpenCV的形式,併爲此分配必要的內存。 @Emile:當然你是對的。應該更好地重複使用相同的圖像,只是將所有內容塗成黑色。甚至不需要使用雙緩衝。感謝您的高舉。 – Theo 2011-03-09 15:54:30