opencv1基於c介面定義的影象儲存格式iplimage*,直接暴露記憶體,如果忘記釋放記憶體,就會造成記憶體洩漏。從opencv2開始,開始使用mat類儲存影象,其新的c++介面,cv::mat代替了原來c風格的cvmat和iplimage。目前,2.0版本對c的介面也是支援的。
相對於c的介面,c++的cv::mat統一了矩陣和影象這兩個概念。事實上,矩陣和影象其實是一樣的。由於cv::mat是c++的類,所以也具備了相關的一些特徵。例如,記憶體的釋放。在c++中,乙個物件超出其使用範圍後,會自動呼叫析構函式進行銷毀。而在c中,如果給cvmat型別的變數使用函式cvcreateimage 等函式分配了記憶體空間,那麼必須呼叫相應的函式cvreleaseimage進行釋放,而不會自動銷毀。如果沒有相應的釋放,則會造成記憶體洩漏。
iplimage這個結構體中儲存影象資料的部分是char * imagedata,這個指標指向影象陣列的首位址。而imagedata是乙個一維陣列,遍歷其資料的方法是使y從0~imagedata->height,假設影象為img,則每一行y位址指標即ptr = img->imagedata+y*img->widthstep,若影象是rgb即三通道的,則每行為3*img->width個資料(每個畫素佔3個資料),通過x和y的遞迴從而操作影象的資料。
另外iplimage的影象資料有的時候不得不轉換到cvmat,特別是二維矩陣以便於矩陣的各種計算,這個時候,轉換的方法為:
cv::mat img(pimg,0); // 0是不複製影像,也就是pimg與img的data共用同個記憶體位置,header各自有
cvreleaseimage(img);//釋放記憶體
cv::mat轉換為iplimage
cv::mat -> iplimage// converts header to iplimage; no data is copied operator iplimage() const; img 是格式為cv::mat的資料
iplimage pimg;
pimg = iplimage(img); // 一樣檔案沒複製
cvreleaseimage(img);//釋放記憶體
cvreleaseimage(img)和free、delete相同,只是把該指標img所指的記憶體給釋放掉,但並沒有把img指標本身乾掉,其位址仍然不變(非null)
opencv學習日記(一)
安裝過 的很詳細 雖然我是看了其他博主的安裝過程,但還是強烈推薦該博主 由於我用的是vs2017,部分同學可能採用vs2015或其他版本,但安裝過程大同小異,只要細心安裝,相信大家都可以快速的使用opencv。影象處理以前學過,但是學的是matlab,沒有學opencv。由於日後的研究方向可能為影象...
opencv學習日記(二)
如下 include using namespace cv int main return0 輸出如下 如下 include include include using namespace std using namespace cv 處理過程較為簡單,主要是對每一幀進行邊緣提取 主要是攝像頭的識別...
學習日記1
學習日誌 姓名 趙鵬 日期 2018.7.9 今日學習任務 安裝環境,學習c語言的基礎知識,包括資料型別,運算子,演算法,函式,以及迴圈語句的掌握。今日任務完成情況 本日任務按照老師要求完成,今日開發中出現的問題彙總 編譯程式的出錯,沒加,演算法結構的不正確和不完整,求餘符號 的使用錯誤。今日未解決...