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

  

 

posted on 2014-12-27 22:44  Charles Huang @ CAS  阅读(2361)  评论(0编辑  收藏  举报

导航