一.cv::Scalar類
1.基本概念
在介紹cv::Scalar類之前,我們先看cv::Scalar_類在Opencv中的定義,如下:
template<typename _Tp> 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<typename _Tp2, int cn>
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<typename T2> operator Scalar_<T2>() 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_<double> 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<opencv2/opencv.hpp>
#include<iostream>
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_類成員函式
二.cv::Size類
1.基本概念
在Opencv中,cv::Size類的定義如下:
template<typename _Tp> 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<typename _Tp2> operator Size_<_Tp2>() const;
_Tp width; //!< the width
_Tp height; //!< the height
};
typedef Size_<int> Size2i;
typedef Size_<int64> Size2l;
typedef Size_<float> Size2f;
typedef Size_<double> 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<opencv2/opencv.hpp>
#include<iostream>
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_類
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293268.html
標籤:其他
