首页 > 代码库 > 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 等,所以需要提前手动分配好内存空间。

  

 

OpenCV 2.4.9 学习笔记(3)—— OpenCV自动为输出数组(矩阵)分配内存