Matg格式:
Mat是matrix(矩阵)的缩写,本质上就是一个二维数组,用于存放图片数据的类
int cv::cols 宽度
int cv::rows 高度
int cv::depth() 深度
int cv::channels() 通道
uchar* cv::data 数据指针
Mat图片数据:
图片宽度:横向像素点个数
图片高度:纵向像素点个数
图片深度:单一像素数据表示(精度) U/S/F ->uchar/char/float
#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 #define CV_16F 7
图片通道:像素通道 C1 -> 灰度C3 -> RGB C4 -> ARGB
以下是通过QT界面展示,OpenCV中Mat的基本属性:
1.在OpenCV通过Cmake编译后,将编译后的文件目录按照代码的方式放置到新建项目的.pro文件
2.在widget.cpp中添加OpenCV两个头文件,新建一个Mat对象并初始化,详细内容看上面说明,接着用qDebug输出Mat对象的基本属性
imgproc模块:
1.读取图片,imgproc模块中的接口
cv::Mat cv::imread(const String & filename, int flags = IMREAD_COLOR)
filename:文件名
flags:读取图片的模式,默认为1,IMREAD_COLOR三通道图像
2.保存图片,imgproc模块中的接口
bool imwrite(const string& filename, inputArray img, const vector
filename:文件名
img:要保存的图片
params:特指参数,一般不写
highgui模块:
1.显示图片在窗口中
void cv::imshow(const String & winname, InputArray mat)
winname:窗口的名字
mat:图片的矩阵
2.等待按键
int cv::waitKey(int delay = 0)
delay:延迟等待的秒数,如果等待时间内没有按下键盘,返回-1,成功返回按下的按键编码,默认0表示永远等待
以下是imgpro和highguil两个模块的基本函数,读取保存图片,展示等操作
1.首先说明保存图片的方式,新建Mat对象并初始化,输出相关信息,将新建的Mat对象保存至某个文件路径下(这里的"\"应换成"\\",关于不可打印字符的表示),并设置名字和格式
2.运行程序后,在桌面(设置的路径)上能看见保存的图片
3.右键打开属性,查看详细信息,跟设置的属性一致,因为没有设置图片的颜色或者没有保存已有的图片,所以默认输出一张没有颜色的图片
4.读取文件目录下的图片并保存至Mat对象中,输出Mat对象基本属性并展示在窗口中
5.添加waitKey(0),则先显示图片,后点击任意键QT默认窗口显示
Mat对象改变大小:
resize:改变图像大小,imgproc中的接口
void resize(InputArray src, OutputArray dst,Size dsize, double fx=0,double fy=0,int interpolation=INTER_LINEAR);
src:源图片,即将此图片进行改变大小操作
dst:目标图片,即改变完毕之后的图片保存在此
dsize:目标大小
fx,fy:缩放比例,若dsize为(0,0),则横向按照fx缩放比例,纵向按照fy缩放比例
缩放方式,默认为INTER_LINEAR,线性插值缩放
以下是Mat对象改变大小的操作:
1.第一种方式,改变宽高。读取图片保存至Mat对象中,新建一个Mat对象保存改变后大小的图片,设置改变后的图片大小
2.第二种方式,改变宽高比例。当设置大小为默认0时,可通过添加宽高的比例因子,缩放图片
Mat对象旋转:
getRotationMatrix2D:获取旋转矩阵,imgproc中的接口
cv::Mat cv::getRotationMatrix2D(cv::Point2f center, double angle, double scale);
center:旋转中心点
angle:角度
scale:缩放比例
wareAffine:仿射变换,可用于旋转图片,imgproc中的接口
void wareAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode=BORDER_CONSTANT,const Scalar&borderValue=Scalar());
src:源图片,即将图片进行旋转操作
dst:目标图片,即旋转完毕之后的图片保存在此
M:变换矩阵,即getRotationMatrix2D获取的旋转角度信息
dsize:旋转大小
flags:缩放模式,默认为INTER_LINEAR, 与resize中的interpola一致
borderMode:边界像素模式,有默认值BORDER_CONSTANT,即填充
borderValue:边界取值,有默认Scalar()即0,全黑,填充颜色
以下是关于Mat对象旋转的展示:
1.读取图片保存至Mat对象中, 新建Mat对象,利用函数将Mat对象进行缩放旋转,背景色填充等操作后保存至新建Mat对象
Mat对象抠图:
ROI:区域选择,即旋转图片中的某个区域,可用于抠图等操作,imgproc模块中的接口
Mat::operator(Rect rect)
rect::截取范围,Rect(x,y,width,height),即左上角的(x,y)坐标,加上宽高
Mat中的成员clone,深拷贝自己的内容
Mat Mat::clone()const;
Mat中的成员copyTo,将自己的图片拷贝至目标
void Mat::copyTo(OutputArray m)const
m:拷贝至m图片
Mat中的成员setTO,将自己设置为某个图片,其中根据选择的mask决定,可以做去背景等操作
Mat& Mat::setTo(InputArray value, InputArray mask=noArray());
value:目标图片
mask:mask中的数据为0的点不会被value覆盖,数据为非0的点才会被value覆盖
以下是Mat对象抠图,其中一些函数可自行尝试:
Mat对象灰度图切换:
cvtColor:颜色空间转换,即将一个图片颜色空间改变并赋值给另一个图片,可以转换灰度图,imgproc模块中的接口
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0);
src:源图片,即将此图片进行颜色转换操作
dst:目标图片,即颜色转换之后的图片保存在此
code:颜色映射类型,BGR2GRAY为灰度图
dstCn:颜色通道,默认为0
在新版本中,CV_BGR@GRAY被COLOR_BGR2GRAY替换,只需将CV改成COLO即可
以下是Mat对象灰度图切换: