转载自:https://www.cnblogs.com/phillips/p/4484717.html
将几种常用访问方式比喻成普通青年、文艺青年、暴力青年
方式1: at<type>(i,j)访问 (普通青年)
例:单通道
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_32FC1);
for (int i=0; i<ROWS ; i++)
{
for (int j=0; j<COLS ; j++)
{
img1.at<float>(i,j) = 3.2f;
}
}
type的对应表:
Mat_<uchar>---------CV_8U
Mat<char>-----------CV_8S
Nat_<short>---------CV_16S
Mat_<ushort>--------CV_16U
Mat_<int>-----------CV_32S
Mat_<float>----------CV_32F
Mat_<double>--------CV_64F
例:多通道
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_8UC3);
for (int i=0; i<ROWS ; i++)
{
for (int j=0; j<COLS ; j++)
{
img1.at<vec3b>(i,j)[0]= 3.2f; // B 通道
img1.at<vec3b>(i,j)[1]= 3.2f; // G 通道
img1.at<vec3b>(i,j)[2]= 3.2f; // R 通道
}
}
注意:core.hpp中有关于vec3b等类型的定义:
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
方式2:ptr<type>(i) [j] 方式 (文艺青年)
Mat的ptr方法,返回<>中模板指定类型的指针,
[]类似于数组访问,得到
例:单通道
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_32FC1);
for (int i=0; i<ROWS ; i++)
{
float* pData1=img5.ptr<float>(i);
for (int j=0; j<COLS ; j++)
{
pData1[j] = 3.2f;
}
}
例: 多通道
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_32FC3);
for (int i=0; i<ROWS ; i++)
{
vec3f* pData1=img5.ptr<vec3f>(i);
for (int j=0; j<COLS ; j++)
{
pData1[j][0] = 3.2f;
pData1[j][1] = 3.2f;
pData1[j][2] = 3.2f;
}
}
方式3:img.data + step[0]*i + step[1]*j 方式
将几种常用访问方式比喻成普通青年、文艺青年、暴力青年
方式1: at<type>(i,j)访问 (普通青年)
例:单通道
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_32FC1);
for (int i=0; i<ROWS ; i++)
{
for (int j=0; j<COLS ; j++)
{
img1.at<float>(i,j) = 3.2f;
}
}
type的对应表:
Mat_<uchar>---------CV_8U
Mat<char>-----------CV_8S
Nat_<short>---------CV_16S
Mat_<ushort>--------CV_16U
Mat_<int>-----------CV_32S
Mat_<float>----------CV_32F
Mat_<double>--------CV_64F
例:多通道
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_8UC3);
for (int i=0; i<ROWS ; i++)
{
for (int j=0; j<COLS ; j++)
{
img1.at<vec3b>(i,j)[0]= 3.2f; // B 通道
img1.at<vec3b>(i,j)[1]= 3.2f; // G 通道
img1.at<vec3b>(i,j)[2]= 3.2f; // R 通道
}
}
注意:core.hpp中有关于vec3b等类型的定义:
typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
方式2:ptr<type>(i) [j] 方式 (文艺青年)
Mat的ptr方法,返回<>中模板指定类型的指针,
[]类似于数组访问,得到
例:单通道
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_32FC1);
for (int i=0; i<ROWS ; i++)
{
float* pData1=img5.ptr<float>(i);
for (int j=0; j<COLS ; j++)
{
pData1[j] = 3.2f;
}
}
例: 多通道
int ROWS = 100; // height
int COLS = 200; // width
Mat img1(ROWS , COLS , CV_32FC3);
for (int i=0; i<ROWS ; i++)
{
vec3f* pData1=img5.ptr<vec3f>(i);
for (int j=0; j<COLS ; j++)
{
pData1[j][0] = 3.2f;
pData1[j][1] = 3.2f;
pData1[j][2] = 3.2f;
}
}
方式3:img.data + step[0]*i + step[1]*j 方式
//该种方式暂不考虑