在介绍cv::Scalar类之前,我们先看cv::Scalar_类在Opencv中的定义,如下:
template class Scalar_ : public Vec<_Tp, 4>
{
public:
// default constructor
Scalar_()//参数数量 0
Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);//参数数量2,3,4都可以
Scalar_(_Tp v0); //参数数量 1
template
Scalar_(const Vec<_Tp2, cn>& v);
//! returns a scalar with all elements set to v0
static Scalar_<_Tp> all(_Tp v0);
//! conversion to another data type
template operator Scalar_() const;
//! per-element product
Scalar_<_Tp> mul(const Scalar_<_Tp>& a, double scale=1 ) const;
//! returns (v0, -v1, -v2, -v3)
Scalar_<_Tp> conj() const;
//! returns true if v1 == v2 == v3 == 0
bool isReal() const;
};
typedef Scalar_ Scalar;
我们再来看一看cv::Scalar_类的默认构造方式的具体实现:
Scalar_<_Tp>::Scalar_()
{
this->val[0] = this->val[1] = this->val[2] = this->val[3] = 0;
}
从中我们可以看出cv::Scalar_类表示是一维数组,只有4个元素,其主要用于Opencv中传递像素值,如RGB颜色值。而通过最后一行我们可以知道cv::Scalar是cv::Scalar_类的double类型的别名,目的是方便声明定义,即cv::Scalar类实际上是一个四维双精度向量。
(1)从定义中我们可以知道cv::Scalar类支持的构造方式有以下几种:
cv::Scalar s;//默认构造方式
cv::Scalar s1(1, 2, 3, 4);
cv::Scalar s2(5, 2);//赋值构造
cv::Scalar s3(s2);//拷贝构造器
(2)cv::Scalar类直接继承自cv::Vec类模板的实例,因此它也继承了cv::Vec类所有向量代数运算,成员访问函数(如operator[])等属性,此外,cv::Scalar类还支持元素乘法,共轭等:
#include
#include
using namespace cv;
using namespace std;
int main()
{
cv::Scalar s;//默认构造方式
cv::Scalar s1(1, 2, 3, 4);
cv::Scalar s2(5, 2);//赋值构造
cv::Scalar s3(s2);//拷贝构造器
cout << "s1=" << s1 << endl;
cout << "s3=" << s3 << endl;
cout << "the first element of s2 is " << s2[0] << endl;
cout << "s1+s2=" << s1 + s2 << endl;
cout <<"元素乘法:"<< s1.mul(s2) << endl;//返回一个四维向量,向量中第n个元素为s1中第n个元素与s2中第n个元素的乘积
cout << "(四元数)共轭" << s1.conj() << endl;//return cv::Scalar(x0,-x1,-x2,-x3)
cout << "(四元数)真正实部检验" << s1.isReal() << endl;//return true if(x1==x2==x3==0)
}
运行结果如下:
附:
1.四元数
2.cv::Scalar_类成员函数
在Opencv中,cv::Size类的定义如下:
template class Size_
{
public:
typedef _Tp value_type;
//! default constructor
Size_();
Size_(_Tp _width, _Tp _height);
Size_(const Size_& sz);
Size_(Size_&& sz) CV_NOEXCEPT;
Size_(const Point_<_Tp>& pt);
Size_& operator = (const Size_& sz);
Size_& operator = (Size_&& sz) CV_NOEXCEPT;
//! the area (width*height)
_Tp area() const;
//! aspect ratio (width/height)
double aspectRatio() const;
//! true if empty
bool empty() const;
//! conversion of another data type.
template operator Size_<_Tp2>() const;
_Tp width; //!< the width
_Tp height; //!< the height
};
typedef Size_ Size2i;
typedef Size_ Size2l;
typedef Size_ Size2f;
typedef Size_ Size2d;
typedef Size2i Size;
与cv::Scalar类一样,cv::Size类(尺寸类)是cv::Size_类int类型的别名,其主要作用是用于指定图像或矩形大小。它在实践中与cv::Point类一样,并且可以与cv::Point类相互转换,两者的主要区别是cv::Point类的成员变量名是x和y,cv::Size类的成员变量名是width和height。
(1)cv::Size类的构造方式也有默认构造,赋值构造,拷贝构造三种:
cv::Size s;
cv::Size2f s1;//默认构造
cv::Size2d s2(4, 5);//赋值构造
cv::Size2d s3(s2);//拷贝构造
(2)cv::Size类常用的运算主要有area()函数,用于计算面积,返回值为width*height, aspectRatio()函数,用于计算纵横比(宽度/高度),以及一个判断是否为空的empty()函数:
#include
#include
using namespace cv;
using namespace std;
int main()
{
Size s;
Size2f s1;//默认构造
Size2d s2(4, 5);//赋值构造
Size2d s3(s2);//拷贝构造
cout << s2.height << " " << s2.width << endl;//成员访问
cout << "the area =" << s3.area() << endl;
cout << "tne aspectRatio=" << s3.aspectRatio() << endl;
cout << s3.empty() << endl;
}
运行后的结果为:
附:
cv::Size_类