OpenCV 中的 Scalar 类、Vec类

本文详细介绍了OpenCV中的Scalar和Vec类。Scalar类作为特殊的Vec向量类模板,用于指定颜色;Vec类则作为通用的向量模板,支持不同类型的多维数据表示。文章深入探讨了这两类的构造函数、成员函数及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转 自 http://www.bubuko.com/infodetail-1533054.html

文章目录

Scalar 类

	typedef Scalar_<double> Scalar;

*【1】Scalar类的–类模板
*【2】这是一个使用4个元素指定的特殊的Vec向量类模板的类模板
*【3】通常使用的是–cv::Scalar
*【3】其实也就是说—Scalar颜色类—是一个特殊的----向量类

	template<typename _Tp> class Scalar_ : public Vec<_Tp, 4>
	{
	public:
		//! various constructors
		//【1】默认构造函数
		Scalar_();
		//【2】很重要的一个默认构造函数
		//【3】这个默认构造函数的四个参数分别表示RGB+Alpha颜色中的:
				//【1】v0---表示RGB中的------blue-----B---蓝色分量
				//【2】v1---表示RGB中的------Green----G---绿色分量
				//【3】v2---表示RGB中的------Red------R---红色分量
				//【4】v3---表示Alpha---------------------透明色分量
		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
		//【2】------------------------------成员函数--------------------------------------
		//【1】返回一个用v0设置所有颜色的Scalar类
		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;
	};

Vec 类

  向量模板类Vec的表示--------Vec2b,Vec3b,Vec2s,Vec3s类。

*【1】Vec—是一个OpenCv的—向量类模板(向量模板类)----我比较喜欢Vec把称作向量类模板,这是因为“向量类”–首相说明Vec—它是一个类。
  ● 然后"模板"—说明它是一个—模板类

*【2】Vec—向量类模板的类模板原型:

	template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>

*【3】我们可以看得出,它其实就是一个“一维的矩阵”,这是因为:
  ● 1–在OpenCv中没有向量(vector)结构,任何时候需要向量,都只需要一个列矩阵(如果需要一个转置或者共轭向量,则需要一个行向量)
  ● 2–OpenCv矩阵的概念与我们线性代数课上学习的概念相比,更加抽象,这是因为线性代数中的矩阵,矩阵中的矩阵元素只能存储–数值型数据,而OpenCv不是这样的

*【4】Vec<int,n>—就是用类型int和将向量模板类做一个实例化,实例化为一个具体的类.其中,第一个参数int–表示Vec中存储的为int类型;第二个参数n为一个整型值,表示Vec每个对象中存储n个int值,也就是—n维向量(列向量)

//【1】下面是OpenCv中定义---定义---向量模板类----的源代码
//【2】一个拥有非类型模板形参的---类模板-----向量模板类
 template<typename _Tp, int cn> class Vec : public Matx<_Tp, cn, 1>
{
	public:
		typedef _Tp value_type;
		enum { depth = DataDepth<_Tp>::value, channels = cn, 
					type = CV_MAKETYPE(depth, channels) };
					
	//! default constructor
	//【1】向量类的默认构造函数
	Vec();

	Vec(_Tp v0); //!< 1-element vector constructor
	Vec(_Tp v0, _Tp v1); //!< 2-element vector constructor
	Vec(_Tp v0, _Tp v1, _Tp v2); //!< 3-element vector constructor
	Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3); //!< 4-element vector constructor
	Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4); //!< 5-element vector constructor
	Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5); //!< 6-element vector constructor
	Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6); //!< 7-element vector constructor
	Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7); //!< 8-element vector constructor
	Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8); //!< 9-element vector constructor
	Vec(_Tp v0, _Tp v1, _Tp v2, _Tp v3, _Tp v4, _Tp v5, _Tp v6, _Tp v7, _Tp v8, _Tp v9); //!< 10-element vector constructor
	explicit Vec(const _Tp* values);

	Vec(const Vec<_Tp, cn>& v);

	static Vec all(_Tp alpha);

	//! per-element multiplication
	Vec mul(const Vec<_Tp, cn>& v) const;

	//! conjugation (makes sense for complex numbers and quaternions)
	Vec conj() const;

	/*!
	  cross product of the two 3D vectors.

	  For other dimensionalities the exception is raised
	*/
	Vec cross(const Vec& v) const;
	//! convertion to another data type
	template<typename T2> operator Vec<T2, cn>() const;
	//! conversion to 4-element CvScalar.
	operator CvScalar() const;

	/*! element access */
	const _Tp& operator [](int i) const;
	_Tp& operator[](int i);
	const _Tp& operator ()(int i) const;
	_Tp& operator ()(int i);

	Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_AddOp);
	Vec(const Matx<_Tp, cn, 1>& a, const Matx<_Tp, cn, 1>& b, Matx_SubOp);
	template<typename _T2> Vec(const Matx<_Tp, cn, 1>& a, _T2 alpha, Matx_ScaleOp);
};	
//【3】用typedef关键字给---向量类模板----template<typename _Tp, int cn> class Vec
	//【1】向量模板类Vec的实例化,并且给相应实例的Vec向量模板类实例---指定新的名字
	//【1】Vec2b--这是一个具体的--类类型---这个类类型实例话的类对象表示如下所示:
	//【1】Vec2b---表示每个Vec2b对象中,可以存储2个char(字符型)数据
	typedef Vec<uchar, 2> Vec2b;//【2】Vec3b---表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的一个像素点
	typedef Vec<uchar, 3> Vec3b;
	//【3】Vec4b---表示每一个Vec4b对象中,可以存储4个字符型数据,可以用这样的类对象去存储---4通道RGB+Alpha的图像中的像素点
	typedef Vec<uchar, 4> Vec4b;
             
	//【1】Vec2s---表示这个类的每一个类对象,可以存储2个short int(短整型)的数据
	typedef Vec<short, 2> Vec2s;
	typedef Vec<short, 3> Vec3s;
	typedef Vec<short, 4> Vec4s;

	typedef Vec<ushort, 2> Vec2w;
	typedef Vec<ushort, 3> Vec3w;
	typedef Vec<ushort, 4> Vec4w;

	typedef Vec<int, 2> Vec2i;
	typedef Vec<int, 3> Vec3i;
	typedef Vec<int, 4> Vec4i;
	typedef Vec<int, 6> Vec6i;
	typedef Vec<int, 8> Vec8i;

	typedef Vec<float, 2> Vec2f;
	typedef Vec<float, 3> Vec3f;
	typedef Vec<float, 4> Vec4f;
	typedef Vec<float, 6> Vec6f;

	typedef Vec<double, 2> Vec2d;
	typedef Vec<double, 3> Vec3d;
	typedef Vec<double, 4> Vec4d;
	typedef Vec<double, 6> Vec6d;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值