小白一枚~ 以下是自己在学习过程中见到的Mat的一些用法,记录一下(注:前面有解释的后面不再解释啦~):
首先是定义Mat型时的一些:
1. Mat::Mat(int rows, int cols, int type)
rows:矩阵行数
cols:矩阵列数
type:CV_8UC1(8位 uchar型 (channel)1通道) 类似可以定义些CV_32FC3.说明:CV_(位数)+(数据类型)+(通道 数)
#include<iostream>
#include<opencv/highgui.h>
using namespace std;
using namespace cv;
int main(int argc,char**argv)
{
Mat A(3,2,CV_8UC1);//一通道
Mat B(3,2,CV_32FC3);//三通道
cout<<"A="<<A<<endl;
cout<<"B="<<B<<endl;
}
输出为:
A=[ 0, 0;
0, 0;
0, 0]
B=[0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0]
2. Mat::Mat(Size size, int type)
Size:矩阵大小 //可以用别的图像的大小也可以自定Size(width,heighth)
#include<iostream>
#include<opencv/highgui.h>
using namespace std;
using namespace cv;
int main(int argc,char**argv)
{
Mat A(3,2,CV_8UC1);//一通道
Mat B(A.size(),CV_32FC3); //以A的大小定义
cout<<"B="<<B<<endl;
}
输出为:
B=[0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0;
0, 0, 0, 0, 0, 0]
3.:Mat sampleMat = (Mat_< float>(1, 2) << num1, num2);
这是定义类一个一行两列的内容为float类型的矩阵,并且将num1,num2这两个数赋给矩阵
#include<iostream>
#include<opencv/highgui.h>
using namespace std;
using namespace cv;
int main(int argc,char**argv)
{
float num1=2;
float num2=4;
Mat sampleMat = (Mat_<float>(1, 2) << num1, num2);
cout<<"sampleMat="<<sampleMat<<endl;
}
输出如下:sampleMat=[2, 4]
4.:Mat DataMat(1, 2, CV_32FC1, &a[i][0]);
此处假设a[i][2]。则定义了个一行两列的矩阵,类型为32位浮点型单通道,然后将a[i][0],a[i][1]的值赋给了矩阵。
5.:MatLab中的常用矩阵定义:
零矩阵:cv::Mat::zeros(rows,cols,type)
one矩阵:cv::Mat::ones(rows,cols,type)
单位矩阵:cv::Mat::eye(rows,cols,type)
#include<iostream>
#include<opencv/highgui.h>
using namespace std;
using namespace cv;
int main(int argc,char**argv)
{
Mat A=Mat::zeros(5,5,CV_8UC1);
Mat B=Mat::ones(5,5,CV_8UC1);
Mat C=Mat::eye(5,5,CV_8UC1);
cout<<"A="<<A<<endl;
cout<<"B="<<B<<endl;
cout<<"C="<<C<<endl;
}
输出如下:
A=[ 0, 0, 0, 0, 0;
0, 0, 0, 0, 0;
0, 0, 0, 0, 0;
0, 0, 0, 0, 0;
0, 0, 0, 0, 0]
B=[ 1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1;
1, 1, 1, 1, 1]
C=[ 1, 0, 0, 0, 0;
0, 1, 0, 0, 0;
0, 0, 1, 0, 0;
0, 0, 0, 1, 0;
0, 0, 0, 0, 1]
6.:Mat B:B.row(i)取一行
#include<iostream>
#include<opencv/highgui.h>
using namespace std;
using namespace cv;
int main(int argc,char**argv)
{
Mat B=Mat::ones(5,5,CV_8UC1);
Mat A=Mat::eye(5,5,CV_8UC1);
cout<<"B的第一列:"<<B.row(1)<<endl;
cout<<"A的第一行:"<<A.col(1)<<endl;
}
输出:
B的第一列:[ 1, 1, 1, 1, 1]
A的第一行:[ 0;
1;
0;
0;
0]
其次是使用时的一些:
1.运用已有Mat型result转化成其他类型
Mat result;//将result转化成32FC3型保存至resultf中
Mat resultf;
result.convertTo(resultf,CV_32FC3)
2.作为绘制模板时(定义0矩阵)
Mat output=Mat::zeros(img.rows,img.cols,CV_8UC3)
3.克隆(复制)其他图片
Mat srcImage=imread("1.jpg");
Mat copyImage=srcImage.clone(); //完全复制
Mat image1(srcImage) ;//仅是创建了Mat的头部分,image1与srcImage共享数据区
Mat image1 = srcImage ;//仅是创建了Mat的头部分,image1与srcImage共享数据区
Mat copyImage2;
srcImage.copyTo(copyImage2);//完全复制