OpenCV中Mat的基本要素

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tissar/article/details/83349892

版权声明

本文为博主原创文章,未经博主允许不得转载。

OpenCV 中的 Mat 类

Mat 是英文单词矩阵(matrix)的缩写。

Mat 类是 OpenCV 中最核心的类,所有计算机视觉的处理都要先转换为 Mat 类,然后调用库函数实现。

Mat类包含在头文件core.hpp中:

#include <opencv2/core/core.hpp>   /* OpenCV 2 */
#include <opencv2/core.hpp>        /* OpenCV 3 */

Mat 类的四个基本要素

Mat 类的四个基本要素为:

  1. 行数(rows)
  2. 列数(cols)
  3. 通道数(channels)
  4. 数据类型(type)

在 C++ 中查看Mat类的四要素

#include <iostream>
using namespace std;

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;

int main(int argc, char **argv)
{
	Mat img = imread( "path", IMREAD_COLOR );  /* path为图片的路径 */
	cout << "rows:" << img.rows << endl;
	cout << "cols:" << img.cols << endl;
	cout << "channels:" << img.channels() << endl;
	cout << img.type() << endl;
    retrurn 0;
}

行数

Mat的行数对应图片的宽

列数

Mat的列数对应图片的长

通道数

Mat的通道数就是图片的通道数。

常见的通道数为1、3、4。

灰度图(黑白图片)通道数为1,
没有透明度的彩色图片通道数为3,
有透明度的彩色图片的通道数为4。

数据类型

Mat 的数据类型体现在3个方面:

  1. 编码类型(整形、浮点型)
  2. 长度类型(8位、16位、32位、64位)
  3. 符号类型(有符号、无符号)

排列组合后一共有7种类型:

#define  CV_8U    0
#define  CV_8S    1
#define  CV_16U   2
#define  CV_16S   3
#define  CV_32S   4
#define  CV_32F   5
#define  CV_64F   6

行列数变换

行列数的变换对应图片的放大缩小,在 OpenCV3 中,可以调用函数 resize() 实现。

  1. 函数原型(opencv2/imgproc.hpp)
 void resize( InputArray src, OutputArray dst,
              Size dsize, double fx = 0, double fy = 0,
              int interpolation = INTER_LINEAR );
  1. 函数说明
函数用于缩放图片矩阵。
可以固定长宽的拉伸缩放,也可以固定比列缩放。
放大图片时需用到插值算法,可选的插值算法有:
    1. 最近邻插值(nearest neighbor interpolation)
    2. 双线性插值(bilinear interpolation)
    3. 双三次插值(bicubic interpolation)
    4. 基于像素区域关系(resampling using pixel area relation)
    5. 兰索斯插值(Lanczos interpolation)
  1. 参数说明
@param src             输入图像矩阵
@param dst             输出图像矩阵
@param dsize           输出图像大小
@param fx              水平方向上缩放比列
@param fy              垂直方向上缩放比列
@param interpolation   插值方法。由枚举类型InterpolationFlags定义。
  1. 示例
dst 的大小已知的拉伸缩放:
     resize(src, dst, dst.size(), 0, 0, interpolation);
     
 dst 的大小由缩放比例决定:
     resize(src, dst, Size(), 0.5, 0.5, interpolation);

通道数变换

在图片输出时,通常会用到通道数变换和数据类型变换。cvtColor()实现。

  1. 函数原型(opencv2/imgproc.hpp)
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
  1. 函数说明
将输入图片转换成其他通道类型。
  1. 参数说明
@param src    输入图片矩阵,编码类型只能是8U,16U,32F中的一个
@param dst    输出图片矩阵,size和depth和输入图片一样
@param code   色彩空间转换规则,在枚举类型ColorConversionCodes中定义
@param dstCn  输出目标通道数,在code确定时可忽略
  1. 示例
Mat img = imread("path", IMREAD_COLORE);  /* 以3通道读取图片  */
img.convertTo(img, CV_8U);                /* 确保数据类型为8U */
cvtColor(img, img, COLOR_RGB2RGBA);       /* 增加一条透明通道 */

数据类型变换

Mat::convertTo()是一条动态函数,可以用于数据类型变换。

  1. 函数原型(opencv2/core.hpp)
void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;
  1. 函数说明
通过rtype,将输入图片转换成其他数据类型。
通过alpha和beta,调整图片亮度
  1. 参数说明
@param m       输出矩阵。
@param rtype   变换后类型。
@param alpha   RGB曲线斜率变换系数
@param beta    RGB曲线平移变换系数
  1. 示例
Mat img = imread("path", IMREAD_COLORE);  /* 以3通道读取图片 */
img.convertTo(img, CV_8U);                /* 每条通道深度为8 */

猜你喜欢

转载自blog.csdn.net/tissar/article/details/83349892