1. 程式人生 > >OpenCV 2.4.9 學習筆記(3)—— OpenCV自動為輸出陣列(矩陣)分配記憶體

OpenCV 2.4.9 學習筆記(3)—— OpenCV自動為輸出陣列(矩陣)分配記憶體

  OpenCV大部分時候會為OpenCV方法中的輸出資料(方法的引數)自動分配記憶體,所以如果一個方法的引數有一個或者多個輸入陣列(cv::Mat 例項)和一些輸出陣列時,OpenCV會自動為輸出陣列分配記憶體空間或者重新分配記憶體空間,記憶體的大小和資料型別由輸入陣列決定。如果需要的話,這個方法會通過其他的引數來決定輸出陣列的其他屬性。

  下面用一段程式碼來說明一下:

 1 #include "cv.h"
 2 #include "highgui.h"
 3 
 4 using namespace cv;
 5 
 6 int main(int, char**)
 7
{ 8 VideoCapture cap(0); 9 if(!cap.isOpened()) 10 { 11 return -1; 12 } 13 Mat frame, edges; 14 namedWindow("edges",1); 15 for(;;) 16 { 17 cap >> frame; 18 cvtColor(frame, edges, CV_BGR2GRAY); 19 GaussianBlur(edges, edges, Size(7
,7), 1.5, 1.5); 20 Canny(edges, edges, 0, 30, 3); 21 imshow("edges", edges); 22 if(waitKey(30) >= 0) 23 { 24 break; 25 } 26 } 27 return 0; 28 }

  >>會為陣列frame自動分配記憶體空間,因為視訊分析模組VideoCapture元件已經能夠獲取到USB攝像頭的解析度以及位深度資訊了。而cvtColor方法為edges陣列自動分配了記憶體,edges陣列的資料資訊與輸入陣列一樣,而CV_BGR2GRAY決定了輸出影象的顏色空間型別。在上面的迴圈中,edges的記憶體只會被分配一次,如果輸入的影象的解析度改變了,則會重新分配一次記憶體。記憶體分配的關鍵功能是在Mat::Create放裡面就已經完成了,它負責獲取資料需要的相關資訊,如果edges的size,depth等資料都有了,而且不需要變化則Ceate方法不會做任何事情,除非,之前的分配好的記憶體空間被釋放掉了(這裡釋放的時候,需要去將指標計數器減1,並與0比較一下),釋放掉了則會重新分配一個符合需要的記憶體空間。OpenCV中的大部分方法都會呼叫Create方法(如果要用到Mat的話),所以會為輸出陣列分配空間。

  也有一些不會自動為輸出陣列分配記憶體的,比如cv::mixChannels, cv::RNG::fill 等,所以需要提前手動分配好記憶體空間。