2015-07-02 173 views
2

在opencv,Vec2b,Vec3b中有不同的類型。 Vec4i等等,還有Scalar類型。據我所知,Vec3b和Scalar都是將三個數字一起存儲的類型。所以,如果我想訪問一個像素(RGB格式),我只是在編寫image.at <Vec3b> (x,y)=Vec3b (number, number, number),對於Scalar也是如此,但是它們有什麼不同呢,它們有什麼區別嗎?
我在問這個,因爲我在使用Vec3b和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而不是標量時,我得到了正常的結果。爲什麼會發生?在opencv中Vec3b和Scalar有什麼區別?

+0

另外,儘可能使用'Mat1b','Mat3b'等,以避免'.at ' – Miki

+2

標量是典型的代表BGRA值的4個元素,主要用作INPUT元素,其中函數只使用需要的標量。 – Micka

回答

3

根據http://docs.opencv.org/modules/core/doc/basic_structures.htmlScalar_是用於從Vec衍生的4元件矢量

模板類。

哪個

正在從Vec<_Tp, 4>Scalar_Scalar衍生可用於就像典型的4元素矢量。另外,它們可以轉換爲/從CvScalar。類型Scalar被廣泛用於OpenCV來傳遞像素值。

凡作爲Vec是:

而且

Vec類通常用於:爲短的數值向量,的Matx部分殼體

模板類來描述多通道陣列的像素類型。詳情請參閱Mat

所以他們是和不是一樣的。