Opencv中Vec3b和Scalar有什么区别?

时间:2015-07-02 12:09:02

标签: c++ opencv

opencv,Vec2b,Vec3b有不同的类型。 Vec4i等等,还有Scalar类型。据我所知,Vec3b和Scalar都是用于存储三个数字的类型。所以,如果我想访问一个像素(RGB格式),我只是写image.at <Vec3b> (x,y)=Vec3b ( number, number, number),Scalar也是这样,但它们的区别是什么呢?    我问这个,因为我在使用Vec3b和Scalar时遇到了一些奇怪的经历,当我起诉Scalar时(我试图将一些像素转换为灰度但是将图像保留为RGB格式) 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时,我得到了正常的结果。为什么会这样?

1 个答案:

答案 0 :(得分:3)

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

  

Vec<_Tp, 4>派生的4元素向量的模板类。

哪些

  

源自Scalar_ScalarCvScalar可以用作典型的4元素向量。此外,它们可以转换为Scalar。类型Vec在OpenCV中广泛用于传递像素值。

Matx的位置是:

  

短数值向量的模板类,Vec的部分情况:

  

Mat类通常用于描述多通道数组的像素类型。有关详细信息,请参阅RewriteEngine On RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

所以他们是和不一样的。