2015-10-01 19 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个通道的图像的像素值。