Vec3b和Scalar在opencv中有什么区别?

Dav*_*yan 3 c++ opencv

opencv,Vec2b和Vec3b中有不同的类型。Vec4i等,并且有标量类型。据我了解,Vec3b和Scalar都是将三个数字存储在一起的类型。因此,如果我要访问一个我所写的像素(RGB格式)image.at <Vec3b> (x,y)=Vec3b ( number, number, number),Scalar也是一样,但是它们之间有什么区别,甚至还有区别吗?
我问这个问题是因为我在使用Scalar时(我正在尝试将一些像素转换为灰度,但将图像保留为RGB格式)时,使用Vec3b和Scalar有一些奇怪的经验 image.at<Scalar>(x,y)=Scalar( gray_image.at<uchar>(x,y), gray_image.at<uchar>(x,y), gray_image.at<uchar>(x,y));(我在灰度(称为gray_image),但是这似乎给出了一些奇怪的结果,另一方面,当我使用Vec3b而不是Scalar时,我得到的是正常结果。为什么会这样呢?

Nat*_*ica 5

根据http://docs.opencv.org/modules/core/doc/basic_structures.html A Scalar_

衍生自的4元素向量的模板类Vec

哪一个

被衍生Vec<_Tp, 4>Scalar_并且Scalar可以使用,正如典型的4元素矢量。另外,可以将它们转换为CvScalar。该类型Scalar在OpenCV中广泛用于传递像素值。

其中a Vec是:

短数值向量的模板类,部分情况为Matx

所述Vec类通常用于描述像素类型的多通道阵列。有关Mat详细信息,请参见。

因此,它们是相同的,也不相同。