zoukankan      html  css  js  c++  java
  • opencv笔记1

    在opencv2.0前,opencv使用C语言实现相关函数,那个时候存储图像的文件类型是IplImage,需要程序员手动管理内存。

    在opencv2.0后,opencv引入了C++,Mat类就是其中一个变化。

      Mat类似于STL中的容器类,能够动态管理内存。Mat类两部分数据,第一个是数据头(matrix header),它的占用的空间大小恒定,它包含了像素矩阵的大小,存储文件的方式,像素矩阵存储的地址等等。第二个是指向像素矩阵的指针,指正指向的大小不恒定,根据图像的变化而变化。

    由于图像处理,往往会涉及大规模的数据,如果像拷贝其他数据结构一样拷贝Mat,会产生非常高的数据开销。所以,Mat类的不同实例的拷贝,只拷贝数据头。

    Mat A, B;
    A= imread("1.jpg",CV_LOAD_IMAGE_COLOR);
    B=A;
    Mat C(A);
    

      上述代码,A B C都指向同一块像素矩阵。这里有一个叫做引用机制(reference counting machanism)的东西,就是说如果有多个同时复制的Mat对象,只当最后一个Mat对象被删除时,像素矩阵才会随着一起删除。

    如果想要把像素矩阵也复制过去可以这样:

    Mat A,B;
    A=imread("1.jpg",CV_LOAD_IMAGE_COLOR);
    A.copyto(B);
    //B=A.clone();
    

      Mat的构造函数:

    Mat M(2, 2, CV_8UC3, Scalar(255,0,255));//注意只有二维的Mat才能用<<输出
    cout<<"M="<<endl<<" "<<M<<endl;
    

    参数的输入是:

     

    这里的注意2,2指的创建一个2*2的二维数组;

    CV_8UC3是:CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]

    代表3个通道,注意在数组中,这三个通道的数据是连着的,也就是

    [第一个像素的三个通道的值 第二个像素的三个通道的值(第一行结束); 第三个像素的 第四个的]

    Mat类还有很多IplImage结构体所没有的优点,待发掘。

  • 相关阅读:
    Java WebService入门实例
    Maven是什么
    for 循环
    2.4 DevOps工程师的故事:构建运行时的严谨性
    2.3.3 构建微服务的入口:Spring Boot控制器
    2.3.2 引导Spring Boot应用程序:编写引导类
    2.1.3 互相交流:定义服务接口
    第2章 使用Spring Boot构建微服务
    第1章 欢迎来到Cloud和Spring
    第一次在博客园开博
  • 原文地址:https://www.cnblogs.com/wangpei0522/p/3748716.html
Copyright © 2011-2022 走看看