1、将Mat数据中某一列赋值给另一列
Mat data = temp_ref1.colRange(i, i + 1).clone();
2、求取Mat数据的平均值、标准差
Mat data = temp_ref2.colRange(i, i + 1).clone();
Mat tmp_m, tmp_sd;
meanStdDev(data, tmp_m, tmp_sd);
sd_refL[i] = tmp_sd.at<double>(0, 0);
m_refL[i] = tmp_m.at<double>(0, 0);
3、opencv中数据格式
例如:CV_32FC2是指一个32位浮点型双通道矩阵;CV_8UC1 是指一个8位无符号整型单通道矩阵。
S = 符号整型 U = 无符号整型 F = 浮点型
CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
CV_32SC1 CV_32FC1 CV_64FC1
CV_32SC2 CV_32FC2 CV_64FC2
CV_32SC3 CV_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4
4、Mat类复制
(1)拷贝构造函数进行拷贝
这种拷贝方式属于浅拷贝,下面代码中的img和img2都指向相同的内存空间,修改img或者img2,另外一个中的变量也会跟着变化。
Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2(img); // 拷贝构造函数
(2) 赋值运算符进行拷贝
这种拷贝方式属于浅拷贝,下面代码中的img和img2都指向相同的内存空间,修改img或者img2,另外一个中的变量也会跟着变化。
Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2 = img; // 赋值运算符
(3) 使用Rect截取拷贝
这种拷贝方式属于浅拷贝,下面代码中的img2指向的内存空间为img的子内存空间。
Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2(img, Rect(200,200,300,300));
(4)使用clone()函数拷贝
这种拷贝方式属于深拷贝,img和img2分别指向不同的内存空间,修改img或img2 的数据,不影响另一个变量。
Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2 = img.clone();
(5)使用copyTo()函数拷贝
这种拷贝方式属于深拷贝,img和img2分别指向不同的内存空间,修改img或img2 的数据,不影响另一个变量。
Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2;
img.copyTo(img2);
注意:
copyTo 也是深拷贝,但是否申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则只深拷贝并不申请新的空间,否则先申请空间后再进行拷贝。
clone 是完全的深拷贝,在内存中申请新的空间
5、Mat创建
(1)构造函数
Mat img(100,100,CV_8UC3, Scalar(255,255,255));
(2)create()创建对象
Mat img;
img.create(100,100, CV_8UC3);
(3)zeros(),eye(), ones()创建对象
Mat img = zeros(100,100,CV_8UC3); // 全0矩阵
Mat img1 = eye(100,100,CV_8UC3); // 对角为1的对角矩阵
Mat img2 = ones(100,100,CV_8UC3); // 全1矩阵
(4)使用逗号数组创建对象
Mat img = (Mat_<double>(2,2) << 0,1,1,0); // 按行填充
6、mat释放
gdal_mat1.release();
二、Mat运算
1、矩阵相乘
A.dot(B)
3、矩阵对应元素相乘
A.mul(B)
参考内容: