OpenCV中的Vec3bVec2iVec3f等是什么意思?

Posted 昊虹算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV中的Vec3bVec2iVec3f等是什么意思?相关的知识,希望对你有一定的参考价值。

在使用OpenCV的Mat类的成员函数at()访问图像(矩阵)的某个像素的值时,需要填写这个像素数据值的vector动态数组属性。

为什么像素的数据值有vector动态数组属性?因为在OpenCV中的MAT类中,每个像素的数据值是以vector动态数组来存储的。

为什么要以vector动态数组来存储?对于一个单通道图像来说,每个像素的数据值只有1个,当然不需要用什么动态数组来存储。但是我们经常处理的是三通道图像,所以必须考虑多通道的情况。当图像为两通道时,每个像素的数据值有2个;当图像为三通道时,每个像素的数据值有3个。这时,我们就需要数组来存储。C++的vector动态数组有许多优良特性,所以OpenCV的MAT类选择C++的vector动态数组来存储每一个像素的数据值。

标题中的Vec3b、Vec2i、Vec3f等就代表vector动态数组的属性。

具体来说,对应关系如下:

typedef Vec<uchar, 2> Vec2b;//动态数组由两个数组成,这两个数的数据类型为uchar
typedef Vec<uchar, 3> Vec3b;//动态数组由三个数组成,这三个数的数据类型为uchar
typedef Vec<uchar, 4> Vec4b;//动态数组由四个数组成,这四个数的数据类型为uchar

typedef Vec<short, 2> Vec2s;//动态数组由两个数组成,这两个数的数据类型为short
typedef Vec<short, 3> Vec3s;//动态数组由三个数组成,这三个数的数据类型为short
typedef Vec<short, 4> Vec4s;//动态数组由四个数组成,这四个数的数据类型为short

typedef Vec<ushort, 2> Vec2w;//动态数组由两个数组成,这两个数的数据类型为ushort
typedef Vec<ushort, 3> Vec3w;//动态数组由三个数组成,这三个数的数据类型为ushort
typedef Vec<ushort, 4> Vec4w;//动态数组由四个数组成,这四个数的数据类型为ushort

typedef Vec<int, 2> Vec2i;//动态数组由两个数组成,这两个数的数据类型为int
typedef Vec<int, 3> Vec3i;//动态数组由三个数组成,这三个数的数据类型为int
typedef Vec<int, 4> Vec4i;//动态数组由四个数组成,这四个数的数据类型为int
typedef Vec<int, 6> Vec6i;//动态数组由六个数组成,这六个数的数据类型为int
typedef Vec<int, 8> Vec8i;//动态数组由八个数组成,这八个数的数据类型为int

typedef Vec<float, 2> Vec2f;//动态数组由两个数组成,这两个数的数据类型为float
typedef Vec<float, 3> Vec3f;//动态数组由三个数组成,这三个数的数据类型为float
typedef Vec<float, 4> Vec4f;//动态数组由四个数组成,这四个数的数据类型为float
typedef Vec<float, 6> Vec6f;//动态数组由六个数组成,这六个数的数据类型为float

typedef Vec<double, 2> Vec2d;//动态数组由两个数组成,这两个数的数据类型为double
typedef Vec<double, 3> Vec3d;//动态数组由三个数组成,这三个数的数据类型为double
typedef Vec<double, 4> Vec4d;//动态数组由四个数组成,这四个数的数据类型为double
typedef Vec<double, 6> Vec6d;//动态数组由六个数组成,这六个数的数据类型为double

使用示例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 ;
   

使用示例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;
   

使用示例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;
	

以上是关于OpenCV中的Vec3bVec2iVec3f等是什么意思?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中的Vec3bVec2iVec3f等是什么意思?

Angular 单元测试中业力代码覆盖率报告中的 1x 3x 等是啥意思?

Oracle导出数据中的prompt,set feedback 等是什么意思

Oracle导出数据中的prompt,set feedback 等是什么意思

Oracle导出数据中的prompt,set feedback 等是什么意思

Pycharm书写代码时补全提示的cmFfVPa<>T等是什么意思?