OpenCV:Mat的简单构造和读取

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/Teddygogogo/article/details/89958982

参考资料:《学习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;

猜你喜欢

转载自blog.csdn.net/Teddygogogo/article/details/89958982