zoukankan      html  css  js  c++  java
  • 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 等,所以需要提前手动分配好内存空间。

      

     

  • 相关阅读:
    养兔引起轩然大波,做事情执着的他竟做到了年产值3000万元
    凭良心用好料,做卫生包子让他的日营业收入近3000元
    肉牛养殖前景好,他尝到甜头带富了贫困户
    那些年,我们处理过的SQL问题
    windows右键没有新建选项的解决办法
    windows右键没有新建选项的解决办法
    IT服务,共享经济的下一个风口?
    IT服务,共享经济的下一个风口?
    IT服务,共享经济的下一个风口?
    IT服务,共享经济的下一个风口?
  • 原文地址:https://www.cnblogs.com/charleshuang/p/4189338.html
Copyright © 2011-2022 走看看