版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tissar/article/details/83349892
OpenCV中Mat的基本要素
版权声明
本文为博主原创文章,未经博主允许不得转载。
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 类的四个基本要素为:
- 行数(rows)
- 列数(cols)
- 通道数(channels)
- 数据类型(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个方面:
- 编码类型(整形、浮点型)
- 长度类型(8位、16位、32位、64位)
- 符号类型(有符号、无符号)
排列组合后一共有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() 实现。
- 函数原型(opencv2/imgproc.hpp)
void resize( InputArray src, OutputArray dst,
Size dsize, double fx = 0, double fy = 0,
int interpolation = INTER_LINEAR );
- 函数说明
函数用于缩放图片矩阵。
可以固定长宽的拉伸缩放,也可以固定比列缩放。
放大图片时需用到插值算法,可选的插值算法有:
1. 最近邻插值(nearest neighbor interpolation)
2. 双线性插值(bilinear interpolation)
3. 双三次插值(bicubic interpolation)
4. 基于像素区域关系(resampling using pixel area relation)
5. 兰索斯插值(Lanczos interpolation)
- 参数说明
@param src 输入图像矩阵
@param dst 输出图像矩阵
@param dsize 输出图像大小
@param fx 水平方向上缩放比列
@param fy 垂直方向上缩放比列
@param interpolation 插值方法。由枚举类型InterpolationFlags定义。
- 示例
dst 的大小已知的拉伸缩放:
resize(src, dst, dst.size(), 0, 0, interpolation);
dst 的大小由缩放比例决定:
resize(src, dst, Size(), 0.5, 0.5, interpolation);
通道数变换
在图片输出时,通常会用到通道数变换和数据类型变换。cvtColor()实现。
- 函数原型(opencv2/imgproc.hpp)
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
- 函数说明
将输入图片转换成其他通道类型。
- 参数说明
@param src 输入图片矩阵,编码类型只能是8U,16U,32F中的一个
@param dst 输出图片矩阵,size和depth和输入图片一样
@param code 色彩空间转换规则,在枚举类型ColorConversionCodes中定义
@param dstCn 输出目标通道数,在code确定时可忽略
- 示例
Mat img = imread("path", IMREAD_COLORE); /* 以3通道读取图片 */
img.convertTo(img, CV_8U); /* 确保数据类型为8U */
cvtColor(img, img, COLOR_RGB2RGBA); /* 增加一条透明通道 */
数据类型变换
Mat::convertTo()是一条动态函数,可以用于数据类型变换。
- 函数原型(opencv2/core.hpp)
void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;
- 函数说明
通过rtype,将输入图片转换成其他数据类型。
通过alpha和beta,调整图片亮度
- 参数说明
@param m 输出矩阵。
@param rtype 变换后类型。
@param alpha RGB曲线斜率变换系数
@param beta RGB曲线平移变换系数
- 示例
Mat img = imread("path", IMREAD_COLORE); /* 以3通道读取图片 */
img.convertTo(img, CV_8U); /* 每条通道深度为8 */