在使用OpenCV的Mat类的成员函数at()访问图像(矩阵)的某个像素的值时,需要填写这个像素数据值的vector属性。
为什么像素的数据值有vector属性?因为在OpenCV中的MAT类中,每个像素的数据值有两层属性,一是数据类型,比如无符号8位、无符号16位等;二是数量,比如一个像素的数据值可能由1个数组成,也有可能有2个数组成,也有可能有3个数组成,也有可能有4个数组成,具体由几个数组成,得看原图像有几个通道。
填写像素的数据值vector属性时,我们就需要把上面两层属性明确出来。
标题中的Vec3b、Vec2i、Vec3f等就代表像素数据值的vector属性。
具体的对应关系请大家访问本博文的原文查看,
本博文的原文链接如下:
https://www.hhai.cc/thread-80-1-1.html
使用示例1---图像为单通道的情况:
for( int j = 0; j < rows; j++ )
{
for( int i = 0; i < cols; i++ )
{
xMapImage.at<float>(j,i) = cols - i ;
yMapImage.at<float>(j,i) = rows - j ;
}
}
注意:MAT类成员函数at的第一个参数代表行,第二个参数代表列,大家不要被上面的代码误导了,上面的代码在做坐标映射,所以才把j代定为行,i定义为列。
使用示例2-图像为双通道的情况:
for( int i = 0; i < rows; i++ )
{
for( int j = 0; j < cols; j++ )
{
MapImage.at<cv::Vec2f>(i,j)[0] = cols - j;
MapImage.at<cv::Vec2f>(i,j)[1] = i;
}
}
注意:MAT类成员函数at的第一个参数代表行,第二个参数代表列。
使用示例3-图像为三通道的情况:
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
tempImage.at<cv::Vec3b>(i, j)[0] = 100;
tempImage.at<cv::Vec3b>(i, j)[1] = 200;
tempImage.at<cv::Vec3b>(i, j)[2] = 300;
}
}
注意:MAT类成员函数at的第一个参数代表行,第二个参数代表列。