Mat的构造函数
Mat ()
Mat (int rows, int cols, int type)
Mat (Size size, int type)
Mat (int rows, int cols, int type, const Scalar &s)
Mat (Size size, int type, const Scalar &s)
Mat (int ndims, const int *sizes, int type)
Mat (const std::vector< int > &sizes, int type)
Mat (int ndims, const int *sizes, int type, const Scalar &s)
Mat (const std::vector< int > &sizes, int type, const Scalar &s)
Mat (const Mat &m)
Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)
Mat (Size size, int type, void *data, size_t step=AUTO_STEP)
Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)
Mat (const std::vector< int > &sizes, int type, void *data, const size_t *steps=0)
Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all())
Mat (const Mat &m, const Rect &roi)
Mat (const Mat &m, const Range *ranges)
Mat (const Mat &m, const std::vector< Range > &ranges)
mat数值类型
type | type |
---|---|
CV_8UC1 表示8位无符号整型1通道 CV_8UC2 CV_8UC3 CV_8UC4 CV_8UC(n)表示8位无符号整型n通道 | CV_8SC1表示8位整型1通道 CV_8SC2 CV_8SC3 CV_8SC4 CV_8SC(n)表示8位整型n通道 |
CV_16UC1表示16位无符号整型1通道 CV_16UC2 CV_16UC3 CV_16UC4 CV_16UC(n)表示16位无符号整型n通道 | CV_16SC1表示16位整型1通道 CV_16SC2 CV_16SC3 CV_16SC4 CV_16SC(n)表示16位整型n通道 |
CV_32SC1表示32位整型1通道 CV_32SC2 CV_32SC3 CV_32SC4 CV_32SC(n)表示32位整型n通道 | CV_32FC1表示32位浮点型1通道 CV_32FC2 CV_32FC3 CV_32FC4 CV_32FC(n)表示32位浮点型n通道 |
CV_64FC1表示64位浮点型1通道 CV_64FC2 CV_64FC3 CV_64FC4 CV_64FC(n)表示64位浮点型n通道 |
例:Mat初始化
#include <iostream>
#include <vector>
#include "opencv2/opencv.hpp"
using namespace std;
int main() {
//自定义Mat初始化
cv::Mat a1 = (cv::Mat_<int>(3, 3) <<1, 2, 3, 4, 5, 6, 7, 8, 9);
cv::Mat b1 = cv::Mat::Mat(2, 2, CV_16FC1, cv::Scalar(0.5));
cv::Mat b2 = cv::Mat::Mat(2, 2, CV_16FC3, cv::Scalar(2.5,1.5,0.5));
cv::Mat c1(3, 3, CV_8UC3, cv::Scalar(0, 0, 255));
//数组类型转Mat
int sz[2][1] = { 1, 3 };
cv::Mat d1(2, 1, CV_8UC1, sz);
//vector类型转Mat
std::vector<std::vector<double> > v1 = { { 7, 5, 16, 8 },{ 1, 2, 3, 4 } };
cv::Mat mat1(v1.size(), v1.at(0).size(), CV_64FC1);
for (int i = 0; i < mat1.rows; ++i)
for (int j = 0; j < mat1.cols; ++j)
mat1.at<double>(i, j) = v1.at(i).at(j);
// 类似matlib初始化
cv::Mat e1 = cv::Mat::zeros(2, 3, CV_8UC1);
cv::Mat e2 = cv::Mat::ones(4, 4, CV_16FC1);
cv::Mat e3 = cv::Mat::eye(4, 4, CV_16FC1);
// 提取主对角线元素
cv::Mat f1 = a1.diag(0);
;
cout << "a1:\n" << a1 << endl;
cout << "b1:\n" << b1 << endl;
cout << "b2:\n" << b2 << endl;
cout << "c1:\n" << c1 << endl;
cout << "d1:\n" << d1 << endl;
cout << "mat1:\n" << mat1 << endl;
cout << "e1:\n" << e1 << endl;
cout << "e2:\n" << e2 << endl;
cout << "e3:\n" << e3 << endl;
cout << "f1:\n" << f1 << endl;
return 0;
}
结果:
a1:
[1, 2, 3;
4, 5, 6;
7, 8, 9]
b1:
[0.5, 0.5;
0.5, 0.5]
b2:
[2.5, 1.5, 0.5, 2.5, 1.5, 0.5;
2.5, 1.5, 0.5, 2.5, 1.5, 0.5]
c1:
[ 0, 0, 255, 0, 0, 255, 0, 0, 255;
0, 0, 255, 0, 0, 255, 0, 0, 255;
0, 0, 255, 0, 0, 255, 0, 0, 255]
d1:
[ 1;
0]
mat1:
[7, 5, 16, 8;
1, 2, 3, 4]
e1:
[ 0, 0, 0;
0, 0, 0]
e2:
[1, 1, 1, 1;
1, 1, 1, 1;
1, 1, 1, 1;
1, 1, 1, 1]
e3:
[1, 0, 0, 0;
0, 1, 0, 0;
0, 0, 1, 0;
0, 0, 0, 1]
f1:
[1;
5;
9]
例:
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
int main() {
cv::Mat img = cv::imread("building.jpeg",1);
if (img.empty()) {
cout << "...." << endl;
return -1;
}
cv::Rect rect(100, 10, 200, 100);//(x,y=(100,10),w=200,h=100
cv::Mat roi = cv::Mat(img, rect);
cv::Mat img_rect = img.clone();
cv::rectangle(img_rect, rect, cv::Scalar(0, 255, 0), 2);
cv::imshow("original image with rectangle", img_rect);
cv::imshow("roi",roi);
cv::waitKey();
return 0;
}