• cv::Mat用法


    1.Mat基础

    OpenCV2中,数据结构Mat保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵数据指针

    矩阵头主要包含,矩阵尺寸、存储方法,  存储地址(矩阵数据指针)和引用次数等。

    Mat的赋值运算和拷贝构造函数只会拷贝矩阵头,仍然共用同一个矩阵数据。因此,OpenCV进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针。例如:

    1 cv::Mat a ;//创建矩阵头
    2 
    3 a = cv::imread("f:\psb.jpg");//读入图像
    4 
    5 cv::Mat b = a ;//复制 

    多个Mat共用一个矩阵数据,如何释放矩阵数据?——引用计数上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。

    • 当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。

    如何复制矩阵数据本身,真正的复制数据?——clone 或copyTo方法。

    1 cv::Mat c = a.clone();
    2 cv::Mat d ;
    3 a.copyTo(d);

    2.Mat存储方法

    Mat中矩阵的每个元素可以使用不同的数据类型,最小的数据类型是char,占用一个字节或者8位,可以是有符号的(0到255)或者是无符号的(-127到127)。在RGB颜色空间中,使用三个char类型可以表示1600万中颜色,但在图像处理的过程中有可能会使用到float或者double来表示图像的像素。

    Mat的创建

    构造函数

    1 cv::Mat img(2,2,CV_8UC3,cv::Scalar(0,0,255));

    上述代码创建了一个2行2列的矩阵,矩阵元素使用8位无符号char类型保存,具有3通道,每个像素的初始值是(0,0,255)
    构造函数的前两个参数指定了矩阵的行和列
    第三个参数指定矩阵元素的数据类型以及通道数,其指定规则如下:

    CV_[The number of bits per item][Signed or Unsigned][TypePrefix]C[The channel number]

    四部分分别指定:元素的大小,是有符号还是无符号,数据类型以及通道数

    最后一个参数,Scalar是short型的vector,提供矩阵的初始化

    MATLAB形式的初始化

    1 cv::Mat e = cv::Mat::eye(4,4,CV_64F);
    2 cv::Mat z = cv::Mat::ones(2,2,CV_32F);
    3 cv::Mat o = cv::Mat::zeros(3,3,CV_8UC1);

    Mat e是4行4列的对角矩阵

    Mat z是2行2列的单位矩阵

    Mat o是3行3列的零矩阵

    小矩阵的初始化

    对于小矩阵可以使用逗号分割的初始化函数

    Mat c =(Mat_<double>(3,3)<<1,2,3,0,-1,0,4,5,6);

    在对图像进行模板运算时,定义模板使用这种方法是很方便的。

    3.Mat的输入输出

    使用imread函数,向Mat对象中写入一个图像。

    a = cv::imread("f:\psb.jpg");//读入图像

    imread的原型如下

    1 cv::Mat imread(const string& filename,int flags=1)

    filename指定要读取图像的位置

    flags指定图像的颜色空间  

        flags > 0,3通道的彩色图像

        flags = 0, 灰度图像

        flags < 0 ,不作改变

    使用imwrite函数,将Mat对象保存到指定的文件中。

    imwrite的函数原型如下:

    1 bool imwrite(const string& filename,InputArray img,constvector<int>& params=vector<int>())

    filename,指定的文件

    img  要保存的Mat对象

    params 用来指定图像的保存编码方式。

    使用filename的扩展名来指定图像的保存格式(.jpg  .png  .bmp),对于不同的图像保存类型,params是不同的值

    • JPEG,params用来指定图像的质量(0到100),默认的是95.  CV_IMWRITE_JPEG_QUALITY
    • PNG,params用来指定图像的压缩级别(0到9),压缩级别越高图像占用的空间越小,保存图像所用的时间越久。默认值是3. CV_IMWRITE_PNG_COMPRESSION
    • PPM,PGM,PBM,params是一个标记(0或者1),默认的是1.CV_IMWRITE_PXM_BINARY

    imwrite只能保存8位(或者是16位无符号(CV_16UC)的PNG,JPEG200或者TIFF图像)单通道或者三通道的图像,如果要保存的不是这样的图片,可以使用convertTo或者cvtColor来进行转变。

    下面代码展示了如果使用imwrite向文件中写入一个4通道的png图像

     1 void createAlphaMat(Mat &mat) 
     2 {
     3     for(int i = 0 ; i < mat.rows ; i ++) {
     4         for(int j = 0 ; j < mat.cols ; j ++) {
     5             Vec4b &rgba = mat.at<Vec4b>(i,j);
     6             rgba[0] = UCHAR_MAX ;
     7             rgba[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX);
     8             rgba[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX);
     9             rgba[3] = saturate_cast<uchar>(0.5 * (rgba[1] + rgba[2]));
    10         }
    11     }
    12 }
    13 int main()
    14 {
    15     Mat mat(480,640,CV_8UC4);
    16     createAlphaMat(mat);
    17 
    18     vector<int> compression_params ;
    19     compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
    20     compression_params.push_back(9);
    21 
    22     imwrite("alpha.png",mat,compression_params);
    23 
    24     return 0;
    25 }
  • 相关阅读:
    (转)asp.net页面出错时的处理方法
    Angular.js学习笔记 (二) H.U.C
    一套常用的css初始化样式 H.U.C
    hexo工具介绍及使用方法 H.U.C
    Angular.js学习笔记 (一) H.U.C
    Nhibernate 对view 查询的几种方法
    如何做类似google的Textbox的AutoComplete增强版,可以显示多列
    POS 打印机编程控制
    (转) 商品损耗控制
    win 2008 IIS 7 安装 PHPMYAdmin
  • 原文地址:https://www.cnblogs.com/Henry-ZHAO/p/12725254.html
Copyright © 2020-2023  润新知