Opencv常见数据类型(二)

一.cv::Scalar类

1.基本概念

在介绍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类实际上是一个四维双精度向量。

2.用法

(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)
}

运行结果如下:

Opencv常见数据类型(二)_第1张图片

附:

1.四元数

2.cv::Scalar_类成员函数 

二.cv::Size类

1.基本概念

在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;
}

运行后的结果为:

Opencv常见数据类型(二)_第2张图片

附:

cv::Size_类

你可能感兴趣的:(Opencv,c++,opencv)