码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-12-27 23:07:22      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:

  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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!