2015-10-01 54 views
4

Here我們可以看看OpenCV的基本結構。我的問題是什麼數據類型「標量」是什麼,我什麼時候使用它。OpenCV標量數據類型,何時使用?

在這裏你可以看到它的定義:

template<typename _Tp> class CV_EXPORTS Scalar_ : public Vec<_Tp, 4> 
{ 
public: 
//! various constructors 
Scalar_(); 
Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0); 
Scalar_(const CvScalar& s); 
Scalar_(_Tp v0); 

//! returns a scalar with all elements set to v0 
static Scalar_<_Tp> all(_Tp v0); 
//! conversion to the old-style CvScalar 
operator CvScalar() const; 

//! conversion to another data type 
template<typename T2> operator Scalar_<T2>() const; 

//! per-element product 
Scalar_<_Tp> mul(const Scalar_<_Tp>& t, double scale=1) const; 

// returns (v0, -v1, -v2, -v3) 
Scalar_<_Tp> conj() const; 

// returns true iff v1 == v2 == v3 == 0 
bool isReal() const; 
}; 

typedef Scalar_<double> Scalar; 

在這裏你可以看到他們是如何使用它

// make a 7x7 complex matrix filled with 1+3j. 
Mat M(7,7,CV_32FC2,Scalar(1,3)); 
// and now turn M to a 100x60 15-channel 8-bit matrix. 
// The old content will be deallocated 
M.create(100,60,CV_8UC(15)); 

所以我的問題是在這種情況下,我爲什麼不能使用double的例子嗎?或數組?

預先感謝

+3

'Scalar'只是爲了方便使用。由於大部分OpenCV在最大4個通道圖像上運行,所以'標量'是一個簡單的類,它實際上是一個長度爲4的cv :: Vec,OpenCV算法可以根據圖像的通道數量使用它。不要每次都創建一個長度不同的數組,而只需將一個標量值傳遞給算法。 – sgarizvi

+0

感謝您的快速響應 –

回答

2

Scalar是用於從VEC衍生的4元件載體

模板類。

源自Vec < Tp,4>,標量和標量可以用作典型的4元素矢量。 標量類型廣泛用於OpenCV傳遞像素值。

您可以初始化Mat也不同,如:

Mat img(10, 10, CV_32FC2, { 2, 3 }); 

,將在內部轉換爲Vec_。但由於Mat構造函數的簽名接受Scalar,所以最好使用Scalar

這將允許始終使用Scalar傳遞所有具有1到4個通道的圖像的像素值。