Mat类简单用法(一)

来源:互联网 发布:import java 编辑:程序博客网 时间:2024/06/11 04:17

小白一枚~ 以下是自己在学习过程中见到的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);//完全复制
原创粉丝点击