OpeCV中常用基本数据类型的定义分析之一

来源:互联网 发布:常熟淘宝拍摄新颜东路 编辑:程序博客网 时间:2024/06/15 18:32

Point、Size、Rect、Mat 及 Scalar、Vec、Range都是OpenCV中常用的数据类型。

Mat是最强大但也最复杂的一个,而其他类型虽然简单,但是也是最常用的,且它们之间有着紧密的联系,本文先分析这些简单的类型。


1. 定义这些数据类型的目的有哪些?或者有哪些好处?
    1.1 定义这些数据类型有哪些共性?
2. 这些数据类型之间的关系有哪些?如能否相互转化、几何逻辑上的操作关系等
3. 每种数据类型,有哪些定义的接口?为什么要定义这些接口?


在core.hpp中,首先定义了这些基本且重要的数据类型(数据结构)。
定义他们的目的有:
1. 存放基本数据,且采用模板的设计方式,适用于各种数据类型
2. 增加一些与所定义的类型的属性,如逻辑上的包含关系
3. 一些数学操作,重载操作符设计,方便图像图形的常见计算


定义它们的共性:
1. 模板设计方式,适用各种基本数据类型(char,int,float,double等)
   template<typename _Tp> class CV_EXPORTS 
2. 为方便使用,将模板类型特化为常用数据类型
3. 定义在core.hpp文件中,而实现与操作法重载在operation.hpp文件中。
    操作符包括 + - * 计算操作符和+= -= *= 比较运算符 == != 
4. 操作符及成员函数,定义为inline函数    


关系
转换关系
Point_ <-> Size_
Point_ <-> Vec<_TP, 2>

Point3_ <-> Vec<_TP, 3>
Point_ -> Point3_

Rect 包含 (Point, Size)

继承关系:
Scalar_ : public Vec<_Tp, 4>
Vec : public Matx<_Tp, cn, 1>


Matx: 小型矩阵
Mat 完全独立于上面类型的大型自定义数据类型


Point_
特征:
1. 存放多种数据基本类型,常用
2. 成员函数:构造函数重载,内积,inside rect检测
3. 重载各种操作符


Point3_ 
特征与Point_类似

Size_
1. 存放数据
2. 成员函数:面积计算

Rect_
1. 包含Point与Size两种属性
2. 成员:左上、右下点、大小、面积计算、点contain检测

Scalar_
1. 各种构造函数,默认参数为0
2. 成员函数:all静态初始化,mul乘积

Matx
在编译期就需要声明好维数和类型的小型Mat,若使用更灵活的类型,需要用Mat

主要用于数学运算,+ - * inv t转置等,类似matlab中的mat


Vec

1. 相当于一维的Matx

2. 成员mul,cross及数学运算符重载等。


Range
1. 非模板数据类型,整型,一维形式
2. 成员:大小、判空计算

Point、Size、Rect是整数类型的模板特化,最常用类型。



模板声明格式:

template<typename _Tp> class CV_EXPORTS Size_;
template<typename _Tp> class CV_EXPORTS Point_;
template<typename _Tp> class CV_EXPORTS Rect_;
template<typename _Tp, int cn> class CV_EXPORTS Vec;
template<typename _Tp, int m, int n> class CV_EXPORTS Matx;


特化的示例:

typedef Matx<float, 1, 2> Matx12f;
typedef Matx<double, 1, 2> Matx12d;


typedef Vec<float, 2> Vec2f;

typedef Vec<int, 3> Vec3i;

typedef Vec<double, 4> Vec4d;


typedef Size_<float> Size2f;
typedef Point3_<int> Point3i;


typedef Scalar_<double> Scalar;