opencv学习日记——读取多通道矩阵元素的四种方法
以下分别用at ,指针,迭代器,直接法进行读取访问矩阵
第一种:at方法读取
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat a(3, 4, CV_8UC3, Scalar(0, 0, 1));//定义一个3*4,类型8位uchar,通道数3的矩阵
Vec3b vc3 = (int)a.at<uchar>(0,0);//vec3b类型提取多通道矩阵的第一个元素,3代表3通道(其他同理)
int first = vc3.val[0];//提取第一个元素的第一个通道的值,输出类型 int
int second = vc3.val[1];
int third = vc3.val[2];
cout << first << endl;
cout << second << endl;
cout << third << endl;
return 0;
}
‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘
0
0
0
第二种:ptr方法提取
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat a(3, 4, CV_8UC3, Scalar(0, 0, 1));//定义数组
for(int i = 0; i < a.rows; i++)
{
uchar * ptr = a.ptr<uchar>(i);//用指针指向数组每行的第一个位置
for(int j = 0; j < a.cols * a.channels(); j++)//a.cols数组的列数,a.channels()数组的通道数
{
cout << (int)ptr[j] << endl;//输出每行矩阵中的内容
}
}
return 0;
}
‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘
0
0
......
第三种:迭代器访问数组
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat a(3, 4, CV_8UC3, Scalar(0, 0, 3));
MatIterator_<uchar> it = a.begin<uchar>();//第一个值的地址给 it
MatIterator_<uchar> it_end = a.end<uchar>();//最后一个值的地址给 it
for(int i = 0; it != it_end; it++)
{
cout << (int)(*it) ;
if((++i % a.cols) == 0)//提取完一行就换行
{
cout << endl;
}
}
return 0;
}
‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘’‘
0000
0000
0000
第四种:直接法
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
cv::Mat a(3, 3, CV_8UC3);
//直接输入数据 行 列 通道数 读取
cout << (int)(*(a.data + a.step[0] * 1 + a.step[1] * 1 + 1)) << endl;
return 0;
}