RMVL
1.1.1
RoboMaster Vision Library
|
包含 feature 模块的创建、信息获取以及开发时的注意事项
下一篇教程:AprilTag 视觉标签 ↓
基类 rm::feature
对于对象的创建,应该使用 make_feature
静态工厂函数,尽量避免直接使用构造函数。make_feature
方法内部首先会进行能否构造的判断,而不是直接构造,如果条件满足则会创建对应的类对象,并返回其共享指针,如果条件不满足则直接返回 nullptr
。
例如,要构造一个装甲板灯条对象,可以使用以下语句。
所有特征类 rm::feature 的派生对象都 显式弃置 了复制构造函数以及移动构造函数,这说明
是不被允许的。
例如,在 rm::LightBlob 类中,定义了如下语句
rm::feature 由于是扩展模块中最底层的数据组件,因此不存在数据结构类型的信息,仅有包含特征对应属性的信息,这一类信息都采用 getXXX
的形式来获取。特征类中包含了众多属性,有高度、宽度、角度、中心点、角点列表、面积、状态类型、相机外参,均可用形如 getXXX
的方法进行获取,以下是 rm::feature 对于这些方法的定义。
在使用上也和正常的函数完全一致。
对于一些派生的特征特有的属性,比如装甲板灯条 rm::LightBlob 的上顶点,使用上需要额外注意类型转换的内容。一般我们在一些功能模块中,例如 检测与识别模块(功能模块) 中直接操纵的都是抽象类的共享指针 rm::feature::ptr
,如果需要转换成派生类对象,可利用共享指针 std::shared_ptr
中对于动态类型转换的函数:std::dynamic_pointer_cast
,比如想得到 rm::LightBlob 的共享指针,可以使用以下命令。
代码比较冗长,好在所有的派生类都提供了一个转换接口 cast
,为此我们可以像下面的代码一样,更方便的完成动态类型转换。
有了动态类型转换的接口就可以继续获取派生类属性,下面的代码展示了如何获取装甲板灯条的上顶点。
开发与使用是一脉相承的,设计一个新的 rm::feature 派生类对象也要满足使用上的条件,一个新的派生类对象(假设定义为MyFeature
)需要满足以下准则。
namespace rm
中,下文不再赘述;rm::feature
基类;MyFeature::ptr
作为 std::shared_ptr<MyFeature>
的别名;MyFeature::ptr
为返回值的 MyFeature::make_feature
静态工厂函数;setXXX
或 getXXX
的成员方法;ptr
、const_ptr
智能指针类型别名,并分别实现 cast
转换函数