zl程序教程

您现在的位置是:首页 >  后端

当前栏目

OpenCV中的Vec3b、Vec2i、Vec3f等是什么意思?

Opencv 什么 意思
2023-09-11 14:15:39 时间

在使用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的第一个参数代表行,第二个参数代表列。