Mat类型简单介绍

/*
cv::Mat类是用于保存图像以及其他矩阵的数据结构。默认情况下,其尺寸为0,我们也可以设置其初始尺寸,比如定义一个Mat类的对象,就要写cv::Mat pic(320,640,cv::Scalar(100));
Mat类型做为OpenCV2.0新纪元的重要代表“人物”,我们将在后面花长篇幅来说明他。在这里我们仅仅需要理解一句代码即可:
*/
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp> using namespace cv;
int main()
{
Mat myMat = imread("timg.jpg"); //把工程目录下一副名为timg.jpg的图片再入到Mat类型的myMat中 。 这里用的 imread 在下文中会讲到
imshow("jackchen",myMat);
waitKey();
return ;
}

imread简单介绍

首先,我们看imread函数,可以在OpenCV官方文档中查到其原型如下:

    Mat imread(const string& filename, intflags= );  

第一个参数,const string&类型的filename,填我们需要载入的图片路径名。

在Windows操作系统下,OpenCV的imread函数支持如下类型的图像载入:

  • Windows位图 - *.bmp, *.dib
  • JPEG文件 - *.jpeg, *.jpg, *.jpe
  • JPEG 2000文件- *.jp2
  • PNG图片 - *.png
  • 便携文件格式- *.pbm, *.pgm, *.ppm
  • Sun rasters光栅文件 - *.sr, *.ras
  • TIFF 文件 - *.tiff, *.tif

  第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。可以看到它自带缺省值1.所以有时候这个参数在调用时我们可以忽略,在看了下面的讲解之后,我们就会发现,如果在调用时忽略这个参数,就表示载入三通道的彩色图像。

  可以在OpenCV中标识图像格式的枚举体中取值。通过转到定义,我们可以在higui_c.h中发现这个枚举的定义是这样的:

    enum
{
/* 8bit, color or not */
CV_LOAD_IMAGE_UNCHANGED =-,
/* 8bit, gray */
CV_LOAD_IMAGE_GRAYSCALE =,
/* ?, color */
CV_LOAD_IMAGE_COLOR =,
/* any depth, ? */
CV_LOAD_IMAGE_ANYDEPTH =,
/* ?, any color */
CV_LOAD_IMAGE_ANYCOLOR =
};

相应的解释:

  • CV_LOAD_IMAGE_UNCHANGED,这个标识在新版本中被废置了,忽略。
  • CV_LOAD_IMAGE_ANYDEPTH- 如果取这个标识的话,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回。
  • CV_LOAD_IMAGE_COLOR- 如果取这个标识的话,总是转换图像到彩色一体
  • CV_LOAD_IMAGE_GRAYSCALE- 如果取这个标识的话,始终将图像转换成灰度1

如果输入有冲突的标志,将采用较小的数字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR 将载入3通道图。

如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR。

因为flags是int型的变量,如果我们不在这个枚举体中取值的话,还可以这样来:

  • flags >0返回一个3通道的彩色图像。
  • flags =0返回灰度图像。
  • flags <0返回包含Alpha通道的加载的图像。

需要注意的点:输出的图像默认情况下是不载入Alpha通道进来的。如果我们需要载入Alpha通道的话呢,这里就需要取负值。

如果你搞怪,flags取1999,也是可以的,这时就表示返回一个3通道的彩色图像。

好了,讲了这么多,来几个载入示例,一看就懂:

 Mat image0=imread("dota.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);//载入最真实的图像
ge1=imread("dota.jpg",);//载入灰度图
Mat image2=imread("dota.jpg",);//载入3通道的彩色图像
Mat logo=imread("dota_logo.jpg");//载入3通道的彩色图像

2.namedWindow函数

顾名思义,namedWindow函数,用于创建一个窗口。

函数原型是这样的:

void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE ); 

  ■ 第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。

■ 第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:

  • WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
  • WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
  • WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。

函数剖析:

首先需要注意的是,它有默认值WINDOW_AUTOSIZE,所以,一般情况下,这个函数我们填一个变量就行了。

namedWindow函数的作用是,通过指定的名字,创建一个可以作为图像和进度条的容器窗口。如果具有相同名称的窗口已经存在,则函数不做任何事情。

我们可以调用destroyWindow()或者destroyAllWindows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。

但话是这样说,其实对于代码量不大的简单小程序来说,我们完全没有必要手动调用上述的destroyWindow()或者destroyAllWindows()函数,因为在退出时,所有的资源和应用程序的窗口会被操作系统会自动关闭。

3.imshow函数

在指定的窗口中显示一幅图像。

    void imshow(const string& winname, InputArray mat);  

■ 第一个参数,const string&类型的winname,填需要显示的窗口标识名称。

■ 第二个参数,InputArray 类型的mat,填需要显示的图像。

四、输出图像到文件——imwrite函数

在OpenCV中,输出图像到文件,我们一般都用imwrite函数,它的声明如下:

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

■ 第一个参数,const string&类型的filename,填需要写入的文件名就行了,带上后缀,比如,“123.jpg”这样。

■ 第二个参数,InputArray类型的img,一般填一个Mat类型的图像数据就行了。

■ 第三个参数,const vector<int>&类型的params,表示为特定格式保存的参数编码,它有默认值vector<int>(),所以一般情况下不需要填写。而如果要填写的话,有下面这些需要了解的地方:

  • 对于JPEG格式的图片,这个参数表示从0到100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.
  • 对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0到9。较高的值意味着更小的尺寸和更长的压缩时间,而默认值是3。
  • 对于PPM,PGM,或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值是1。

函数解析:

imwrite函数用于将图像保存到指定的文件。图像格式是基于文件扩展名的,可保存的扩展名和imread中可以读取的图像扩展名一样,为了方便查看,我们在这里再列一遍:

  • Windows位图 - *.bmp, *.dib
  • JPEG文件 - *.jpeg, *.jpg, *.jpe
  • JPEG 2000文件- *.jp2
  • PNG图片 - *.png
  • 便携文件格式- *.pbm, *.pgm, *.ppm
  • Sun rasters光栅格式 - *.sr, *.ras
  • TIFF 文件 - *.tiff, *.tif

OpenCV阶段总结扩充。的更多相关文章

  1. Team抢救最后一下

    Team抢救最后一下 Task1:Team抢救的总结 秦玉:       非常荣幸能以团队的方式获得这次的小黄衫,这件衣服的意义不仅是这门课的奖励,也会是我们整个抢救团队的一个见证和回忆~       ...

  2. 可移植的配置visual studio工程第三方库

    现在编程有太多的好用的第三方库,例如 计算机视觉方面的opencv c++的扩充库boost 特殊的第三方库,相机库,通讯库等 使用这些库给我们带来了极大的便利,同时也有很多困扰.这个工程在我电脑上明 ...

  3. XLNet原理探究

    1. 前言 XLNet原文链接是CMU与谷歌大脑提出的全新NLP模型,在20个任务上超过了BERT的表现,并在18个任务上取得了当前最佳效果,包括机器问答.自然语言推断.情感分析和文档排序. 这篇新论 ...

  4. XLNet:运行机制及和Bert的异同比较

    这两天,XLNet貌似也引起了NLP圈的极大关注,从实验数据看,在某些场景下,确实XLNet相对Bert有很大幅度的提升.就像我们之前说的,感觉Bert打开两阶段模式的魔法盒开关后,在这条路上,会有越 ...

  5. opencv —— copyMakeBorder 扩充图像边界

    扩充图像边界:copyMakeBorder 函数 在图像处理过程中,因为卷积算子有一定大小,所以就会导致图像一定范围的边界不能被处理,这时就需要将边界进行适当扩充. void copyMakeBord ...

  6. opencv 61篇

    (一)--安装配置.第一个程序 标签: imagebuildincludeinputpathcmd 2011-10-21 16:16 41132人阅读 评论(50) 收藏 举报  分类: OpenCV ...

  7. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  8. Mac-OSX的Python3.5虚拟环境下安装Opencv

    Mac-OSX的Python3.5虚拟环境下安装Opencv 1   关键词 关键词:Mac,OSX,Python3.5,Virtualenv,Opencv 2   概述 本文是一篇 环境搭建 的基础 ...

  9. zw版·Halcon与delphi(兼谈opencv)

    zw版·Halcon与delphi(兼谈opencv) QQ群 247994767(delphi与halcon) <Halcon与delphi>系列,早两年就想写,不过一方面,因为Halc ...

随机推荐

  1. LoadRunner ERROR: java.lang.NumberFormatException

    Loadrunner中使用lr_xml_get_values()获取服务端返回的字符串LcsId,LcsId为double,需要将该值转换为 int 后传入下一次请求中. 报错如下:Error is ...

  2. 点开看看please

  3. (转)JavaScript中的运算符优先级

    JavaScript中的运算符优先级是一套规则.该规则在计算表达式时控制运算符执行的顺序.具有较高优先级的运算符先于较低优先级的运算符执行.例如,乘法的执行先于加法. 下表按从最高到最低的优先级列出J ...

  4. 动态加载zTree,用key属性设置url链接、icon图标等

      setting 举例 1. 设置 zTree 显示节点时,将 treeNode 的 xUrl 属性当做节点链接的目标 URL var setting = { data: { key: { url: ...

  5. C++ 读取txt文本内容,并将结果保存到新文本

    循序渐进学习读文件 // readFile.cpp : 定义控制台应用程序的入口点. #include "stdafx.h" #include <iostream> # ...

  6. curl --connect-timeout 判断国内外网络windows 批处理

    1.下载编译curl curl 下载地址:http://curl.haxx.se/download.html ,下载后解压到一个目录,使用vs开发者工具里的 “Visual Studio 命令提示(2 ...

  7. JAVA类和对象课后作业

    1.使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询"你已经创建了多少个对象?" 代码: //显示类 //YiMingLai 2 ...

  8. Visual Studio安装及单元测试

    一.安装环境 操作系统版本:Win10中文版64位 CPU:i5-4200M  2.50GHz 硬盘内存:500G 二.软件版本 Visual Studio 2013 三.安装过程 1.首先开始安装, ...

  9. 锤子手机 Smartisan M1L 咖啡金 真皮背面 高配版 5.7

    http://www.smartisan.com/m1/#/os    快人一步的OS http://www.smartisan.com/shop/#/buyphone?c=coffee&v= ...

  10. Emacs 常用快捷键

    关闭欢迎界面:Q 保存:c-x c-s 退出:c-x c-c 暂时退出:c-z       屏幕滚动 移动到下一屏:c-v 移动到上一屏:m-v 将光标所在行置中:c-L       光标移动 上一行 ...