标签:
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自动为输出数组(矩阵)分配内存
标签:
原文地址:http://www.cnblogs.com/charleshuang/p/4189338.html