07_图像容器Mat_详解
Mat 对象的创建
三通道_三维矩阵的创建
方式一
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat M(2,2,CV_8UC3,Scalar(238,130,238));cout << "M= " << endl << M << endl ;imshow("创建的矩阵图",M);waitKey(0);return 0;
}
一通道_一维矩阵的创建
方式二 M.create()
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat M;M.create(4,4,CV_8UC(1));cout << "M= " << endl << M << endl ;imshow("创建的矩阵图",M);waitKey(0);return 0;
}
方式 Mat::eye()
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat E = Mat::eye(4,4,CV_64F);cout << "E= " << endl << E << endl ;imshow("创建的矩阵图",E);waitKey(0);return 0;
}
Mat::ones()
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat O = Mat::ones(4,4,CV_32F);cout << "O= " << endl << O << endl ;imshow("创建的矩阵图",O);waitKey(0);return 0;
}
Mat::zeros()
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat Z = Mat::zeros(4,4,CV_8UC1);cout << "Z= " << endl << Z << endl ;imshow("创建的矩阵图",Z);waitKey(0);return 0;
}
对小矩阵使用逗号分隔式初始化函数
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat C = (Mat_<double>(3,3)<< 0,-1,0,-1,5,-1,0,-1,0);cout << "C= " << endl << C << endl ;imshow("创建的矩阵图",C);waitKey(0);return 0;
}
clone()
一维矩阵_行的克隆
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat C = (Mat_<double>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);cout << "C= " << endl << C << endl << endl ;Mat RowClone = C.row(1).clone();cout << "RowClone= " << endl << RowClone << endl << endl ;imshow("创建的矩阵图",C);imshow("复制的矩阵行",RowClone);waitKey(0);return 0;
}
三维矩阵_行的克隆
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat M(3,3,CV_8UC3,Scalar(238,130,238));cout << "M= " << endl << M << endl << endl <<endl;Mat RowClone = M.row(1).clone();cout << "RowClone= " << endl << RowClone << endl << endl ;imshow("创建的矩阵图",M);imshow("复制的矩阵行",RowClone);waitKey(0);return 0;
}
Mat对象 格式化输出
风格: OpenCV 默认风格
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat r = Mat(10,3,CV_8UC3);randu(r,Scalar::all(0),Scalar::all(255));cout << Scalar::all(0)<< endl;cout << Scalar::all(255)<< endl;cout << "r(OpenCV默认风格)= " << endl << r << endl << endl ;imshow("创建的矩阵图",r);waitKey(0);return 0;
}
randu()
函数_均匀分布
void cv::randu(InputOutputArray dst,InputArray low,InputArray high)
dst : 输入对象(也是输出对象,会直接将dst对象覆盖掉)(通道数1-4)
low: 均匀分布最小值(包括low的),注意要匹配输入对象的通道数
high: 均匀分布最大值(不包括high),同low参数要匹配输入对象的通道数
风格: python 风格
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat r = Mat(10,3,CV_8UC3);randu(r,Scalar::all(0),Scalar::all(255));//cout << "r(python风格)= " << format(r,"python") <<";"<< endl << endl; cout << "r(python风格)= \n" << format(r, Formatter::FMT_PYTHON) << endl << endl;imshow("创建的矩阵图",r);waitKey(0);return 0;
}
风格: 逗号分隔 风格
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat r = Mat(10,3,CV_8UC3);randu(r,Scalar::all(0),Scalar::all(255));cout << "r(逗号分隔风格)= \n" << format(r, Formatter::FMT_CSV) << endl << endl;imshow("创建的矩阵图",r);waitKey(0);return 0;
}
风格: Numpy 风格
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat r = Mat(10,3,CV_8UC3);randu(r,Scalar::all(0),Scalar::all(255));cout << "r(Numpy风格)= \n" << format(r, Formatter::FMT_NUMPY) << endl << endl;imshow("创建的矩阵图",r);waitKey(0);return 0;
}
风格: C语言风格
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Mat r = Mat(10,3,CV_8UC3);randu(r,Scalar::all(0),Scalar::all(255));cout << "r(C语言 风格)= \n" << format(r, Formatter::FMT_C) << endl << endl;imshow("创建的矩阵图",r);waitKey(0);return 0;
}
其他常用数据结构
Point2f
二维点
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Point2f P(6,2);cout << "[二维点]p = " << P << endl << endl;return 0;
}
Point3f
三维点
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){Point3f p3f(8,2,0);cout << endl << "[三维点]p = " << p3f << endl << endl;return 0;
}
vector
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){vector<float> v;v.push_back(3);v.push_back(5);v.push_back(7);cout << "【基于Mat的vector】shortvec = \n" << Mat(v) << endl << endl;imshow("vector",Mat(v));waitKey(0);return 0;
}
#include<iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main(int argc, char** argv){vector<Point2d> points(20);for(size_t i=0; i<points.size();++i){points[i] = Point2f( (float)(i*5), (float)(i%7) );}cout << "【二维点向量】 = points \n" << points << endl << endl;return 0;
}