2022.5.23
一、基本的图像容器矩阵类Mat
#include
#include
using namespace cv;
using namespace std;
int main()
{
Mat A,C;//建立头文件
A=imread("C://Users//asus//Pictures//Saved Pictures//timg.jpg");//imread()函数读取图像,并为矩阵A分配内存,括号内是读取图片路径及名称
Mat B(A);//拷贝构造函数argv[1],CV_LOAD_IMAGE_COLOR
C=A;
imshow("C",C);//输出图像
Mat D(A,Rect(100,100,200,200));//选择矩形,访问A中感兴趣的底层数据,其中(100,100)表起始点,(200,200)表终止点
imshow("D",D);
Mat E=A(Range::all(),Range(50,150));//,选择x轴上位置,访问A中感兴趣的部分,50为X轴上的起点,150为x轴上的终点
imshow("E",E);
//以上为拷贝对象头文件
Mat F=A.clone();
Mat G;
A.copyTo(G);
imshow("F",F);
imshow("G",G);
//以上为完全拷贝,拷贝底层数据,此时对F、G进行修改,不会影响原始数据
waitKey(0);
return 0;
}
1、对于以上所示对象,所有对象最后都指向同一个单独的数据矩阵(访问共有的底层数据),其中任意一个修改,都会影响别的对象
2、可以创建特殊的头文件,只访问底层数据中感兴趣的部分
3、用于输出图像内存分配的opencv是自动的,在此学习中不用考虑内存管理
4、分配操作符和拷贝构造符仅仅只是拷贝头文件
5、clone.()、copy.()函数可拷贝图像底层数据,修改后,不会影响其它对象
2022.5.25
简单Mat矩阵的构建
Mat M(2,3,CV_8UC3,Scalar(120,80,100,50));//二维多通道图像CV_8UC3(CV_[每个基元分量的比特数8][有符号S或无符号U](前为类型前缀)[C通道][通道数3]),Scalar(蓝,绿,红,透明度)
imshow("M",M);//输出图像矩阵色彩和三基色形式
cout<<"M="<(4,4)<<1,1,2,2,
3,3,4,4,
5,5,6,6,
7,7,8,8);//初始化
I.create(4,4,CV_8UC(4));
cout<<"I ="<
1、构建矩阵可以有Mat()构造器、Create()我没搞明白它的意思、对小矩阵直接逗号分隔初始化、对已有的矩阵创造新的头文件并clone()或copyTo、随机函数填充矩阵。(除了create()构造器,还有用数组对Mat()初始化以及为已存的lpllmage(opencv2.4.9之前)指针创建一个头文件还完全不能理解)
2、Matlab初始化函数:zeros()全0,ones()全1,eyes()对角矩阵
2022.5.27
Mat类成员变量
Mat I=(Mat_(4,4)<<1,1,2,2,
3,3,4,4,
5,5,6,6,
7,7,8,8);
//Mat类成员rows()、cols()、row()、col()
cout<<"I ="<
(其中 m = M.dims,即 M的维度) 在此处要重新回顾一下指针,不熟
int i=1,j=1;
uchar *pa=I.data+I.step[0]*i+I.step[1]*j;
float *pDij= (float*)pa;//注意此处的data返回的数据类型,是uchar型,所以指针pa也需要是uchar*型在cout时,要转换成float*型指针,然后再访问该处地址的数据值。
cout<
2022.5.31
矩阵初始化
Mat J(3,5,CV_32FC1,1);//J为3*5的矩阵,float型的单通道,把每个点都初始化为1
Mat K(3,5,CV_32FC1,Scalar(1));//Scalar初始化
//cout<
矩阵初始化除了以上,还有clone、copyto等方法;
diag(int d)d=0主对角线,d=1是比主对角线低的对角线....
Mat::setTo(Scalar &s)以s初始化矩阵
Mat::push_back(Mat)在原来的Mat上在加几行
Mat::pop_back(size_t nelems=1)移除最下边几行(但是这几种都没试过)