<span style="font-size:12px;">//1.使用构造函数,常见的几个如下:
Mat::Mat(); //default
Mat::Mat(int rows, int cols, int type);
Mat::Mat(Size size, int type);
Mat::Mat(int rows, int cols, int type, const Scalar& s);
Mat::Mat(Size size, int type, const Scalar& s);
Mat::Mat(const Mat& m);
//参数说明:
//int rows:高
//int cols:宽
//int type:参见"Mat类型定义"
//Size size:矩阵尺寸,注意宽和高的顺序:Size(cols, rows)
//const Scalar& s:用于初始化矩阵元素的数值
//const Mat& m:拷贝m的矩阵头给新的Mat对象,但是不复制数据!相当于创建了m的一个引用对象
//例子1:创建100*90的矩阵,矩阵元素为3通道32位浮点型
cv::Mat M(100, 90, CV_32FC3);
//例子2:使用一维或多维数组来初始化矩阵,
double m[3][3] = {
{a, b, c}, {d, e, f}, {g, h, i}};
cv::Mat M = cv::Mat(3, 3, CV_64F, m);
//2.使用create函数:
Mat a = create(10, 9, CV_16U); //创建10*9的矩阵,矩阵元素为16位无符号整型
//create的一个特殊用法:如果初始化的时候没有传入size的参数,或者后面需要改变size的参数,可以使用create来调整
// make 7x7 complex matrix filled with 1+3j.
cv::Mat M(7,7,CV_32FC2,Scalar(1,3));
// and now turn M to 100x60 15-channel 8-bit matrix.
// The old content will be deallocated:隐式使用release()释放
M.create(100,60,CV_8UC(15));</span>
- マットのデータ型
Mat マトリックスを作成する場合、通常、そのストレージ要素のデータ型と各マトリックス ポイントのチャネル数を指定する必要があります。次の規則に従って、複数の定義があります。
CV_[桁数][符号付きかどうか][タイププレフィックス]C[チャンネル数]
たとえば、CV_8UC3 は 8 ビットの unsigned char 型を使用することを意味し、各ピクセルは 3 つの要素で構成され、3 つのチャネルを形成します。
Mat は行ごとに格納されます. 行列のデータ型には次が含まれます: Mat_<uchar> は CV_8U に対応, Mat_<uchar> は CV_8U に対応, Mat_<char> は CV_8S に対応, Mat_<int> は CV_32S に対応, Mat_< float> は CV_32F に対応し、Mat_<double> は CV_64F に対応し、対応するデータの深さは次のとおりです。
• CV_8U - 8 ビットの符号なし整数 ( 0..255 )
• CV_8S - 8 ビットの符号付き整数 ( -128..127 )
• CV_16U - 16 ビットの符号なし整数 ( 0..65535 )
• CV_16S - 16 ビット符号付き整数 ( -32768..32767 )
• CV_32S - 32 ビット符号付き整数 ( -2147483648..2147483647 )
• CV_32F - 32 ビットの浮動小数点数 ( -FLT_MAX..FLT_MAX、INF、NAN )
• CV_64F - 64 ビットの浮動小数点数 ( -DBL_MAX..DBL_MAX、INF、NAN )
上記のプロセスに従って 2 チャネル マトリックスを作成した後、at 関数を使用してマトリックスのピクセルにアクセスします。具体的なコードは次のとおりです。
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace std; using namespace cv; int main() { int i, j; Mat dimg(4, 4, CV_64FC2,Scalar(0,1.1));//构造一个4*4的双通道矩阵,数据类型为double cout << "原矩阵" << endl << dimg << endl << endl; for (i = 0; i < dimg.rows; i++) { for (j = 0; j < dimg.cols; j++) { dimg.at<Vec2d>(i, j)[0] = 9.9;//at<type>其中type由矩阵的类型确定,下面会给出详细信息 dimg.at<Vec2d>(i, j)[1] = 100.0; } } cout << "改变后矩阵" << endl << dimg << endl << endl; system("pause"); } /******对应关系******/
template<typename_Tp, int n> class Vec : public Matx<_Tp, n, 1> {...}; typedef Vec<uchar, 2> Vec2b; //无符号双通道 typedef Vec<uchar, 3> Vec3b; //无符号3通道 typedef Vec<uchar, 4> Vec4b; typedef Vec<short, 2> Vec2s; //short型双通道 typedef Vec<short, 3> Vec3s; typedef Vec<short, 4> Vec4s; typedef Vec<int, 2> Vec2i; //整型双通道 typedef Vec<int, 3> Vec3i; typedef Vec<int, 4> Vec4i; typedef Vec<float, 2> Vec2f; //浮点型双通道 typedef Vec<float, 3> Vec3f; typedef Vec<float, 4> Vec4f; typedef Vec<float, 6> Vec6f; typedef Vec<double, 2> Vec2d; //double型双通道 typedef Vec<double, 3> Vec3d; typedef Vec<double, 4> Vec4d; typedef Vec<double, 6> Vec6d;