参考资料:《学习OpenCV3(中文版)》
构造简单Mat矩阵
cv::Mat mat_rown_colm = cv::Mat (rown, colm, type);
type:CV_{8U,16S,16U,32S,32F,64F}C{1,2,3}
构造简单的单通道矩阵
cv::Mat mat_rown_colm = cv::Mat (rown, colm, CV_{8U,16S,16U,32S,32F,64F}C1);
读取Mat矩阵的x行,y列元素
元素的访问方式:位置or迭代器。
直接访问:模板函数at<>(),先将at<>()特化到矩阵所包含的数据类型,然后再通过数据的行、列进行元素的访问。
对于单通道:
cv::Mat m23 = cv::Mat(2,3,32FC1);
m23.at<float>(row, col);
对于多通道:
cv::Mat m23 = cv::Mat(2,3,32FC3);
m23.at<cv::Vec3f>(row,col)[channel];
如果采用单通道的访问方式,将会依次访问元素i的1、2、3通道,比如:
m23.at<float>(0,0) //第1个元素的第1个通道C1
m23.at<float>(0,1) //第1个元素的第2个通道C2
m23.at<float>(0,2) //第1个元素的第3个通道C3
……
m23.at<float>(0,3) //第2个元素的第1个通道C1
……
对于多通道使用模板结构:简化接口
cv::Mat_<Vec3f> m23(2, 3);
m23.at(x, y) = cv::Vec3f(a, b, c);
行指针ptr<>()
数组中的数据是按行连续组织的,不能直接访问一个特定的列:访问二维数组,可以用指针来指定某一行,再找到对应的列元素
模板函数ptr<>()
例子1:(给定一个float单通道的矩阵mtx)
cv::Mat mtx23= cv::Mat::ones(2, 3, CV_32FC1);
//data0是矩阵第1行的指针
float *data0 = mtx23.ptr<float>(0);
//data1是矩阵第2行的指针
float *data1 = mtx23.ptr<float>(1);
例子2:(给定一个float三通道的矩阵mtx)
cv::Mat mtx23 = cv::Mat::zeros(2, 3, CV_32FC3);
//data1是矩阵第1行的指针
Vec3f *data1 = mtx23.ptr<Vec3f>(0);
//访问第1行第1个元素的三个通道
(*data1)[0] = 0;
(*data1)[1] = 1;
(*data1)[2] = 2;
//访问第1行第2个元素的三个通道
(*(data1 + 1))[0] = 3;
(*(data1 + 1))[1] = 4;
(*(data1 + 1))[2] = 5;
//data2是矩阵第2行的指针
Vec3f *data2 = mtx23.ptr<Vec3f>(1);
//访问第2行第1个元素的三个通道
(*data2 )[0] = 0;
(*data2 )[1] = 1;
(*data2 )[2] = 2;
//访问第2行第2个元素的三个通道
(*(data2 + 1))[0] = 3;
(*(data2 + 1))[1] = 4;
(*(data2 + 1))[2] = 5;