识别目标形状（C/C++）
=============

#### 约束与限制

从5.0.0(12)开始，识别目标形状能力支持部分Phone、部分Tablet设备。请参考[硬件要求](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arengine-preparations#硬件要求)判断设备是否支持平面语义及物体语义特性（[ARENGINE\_FEATURE\_TYPE\_SEMANTIC](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arengine-capi-arengine#arengine_featuretype)）。

#### 引入AR Engine

开发者可参考管理AR会话章节的[引入AR Engine](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arengine-c-arsession#引入ar-engine)。

#### 创建AR会话

创建AR会话并配置为目标形状识别模式。

AREngine\_ARSession \*arSession = nullptr;
// 创建AR会话。
HMS\_AREngine\_ARSession\_Create(nullptr, nullptr, &arSession);
AREngine\_ARConfig \*arConfig = nullptr;
// 创建AR会话配置器。
HMS\_AREngine\_ARConfig\_Create(arSession, &arConfig);
// 设置语义识别模式为目标形状识别。
HMS\_AREngine\_ARConfig\_SetSemanticMode(arSession, arConfig, ARENGINE\_SEMANTIC\_MODE\_TARGET);
// 配置器设置给AR会话。
HMS\_AREngine\_ARSession\_Configure(arSession, arConfig);

#### 创建可跟踪对象列表

创建一个可跟踪对象列表targetList，用于存放AR Engine运行过程中检测到的所有可跟踪对象。

AREngine\_ARTrackableList \*targetList = nullptr;
HMS\_AREngine\_ARTrackableList\_Create(arSession, &targetList);

#### 获取当前环境中的可跟踪对象

调用[HMS\_AREngine\_ARSession\_GetAllTrackables](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arengine-capi-arengine#hms_arengine_arsession_getalltrackables)函数，检测当前环境中的所有可跟踪对象，并将结果存放在targetList中。

HMS\_AREngine\_ARSession\_GetAllTrackables(arSession, ARENGINE\_TRACKABLE\_TARGET, targetList);

#### 获取可跟踪对象数量

调用[HMS\_AREngine\_ARTrackableList\_GetSize](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arengine-capi-arengine#hms_arengine_artrackablelist_getsize)函数获取当前可跟踪对象数量，结果存放在targetSize中。

int32\_t targetSize = 0;
HMS\_AREngine\_ARTrackableList\_GetSize(arSession, targetList, &targetSize);

当targetSize等于0时，代表当前环境中无可跟踪对象。

当targetSize等于1时，代表当前环境中仅存在1个可跟踪对象。

当targetSize大于1时，代表当前环境中存在多个可跟踪对象。

#### 遍历并识别物体形状

1.  当环境中存在一个或多个可跟踪对象时，依次遍历targetList中所有可跟踪对象进行目标形状识别。
    
    for (int i = 0; i < targetSize; ++i) {
        // 遍历可跟踪对象，进行形状识别。
    }
    
2.  对于第i个对象，创建并获取对象实例。
    
    AREngine\_ARTrackable \*target = nullptr;
    HMS\_AREngine\_ARTrackableList\_AcquireItem(arSession, targetList, i, &target);
    
3.  获取该实例跟踪状态，仅当跟踪状态为[ARENGINE\_TRACKING\_STATE\_TRACKING](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arengine-capi-arengine#arengine_artrackingstate)时，才可进行形状识别。
    
    AREngine\_ARTrackingState outTrackingState;
    HMS\_AREngine\_ARTrackable\_GetTrackingState(arSession, target, &outTrackingState);
    
    if (AREngine\_ARTrackingState::ARENGINE\_TRACKING\_STATE\_TRACKING != outTrackingState) {
        continue;
    }
    
4.  获取该实例目标形状，识别结果存放在label中。
    
    AREngine\_ARTargetShapeLabel label = ARENGINE\_TARGET\_SHAPE\_UNKNOWN;
    HMS\_AREngine\_ARTarget\_GetShapeType(arSession, reinterpret\_cast<AREngine\_ARTarget \*>(target), &label);
    
    其中，[AREngine\_ARTargetShapeLabel](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arengine-capi-arengine#arengine_artargetshapelabel)为枚举类型，描述了目标物体形状。
    

#### 销毁可跟踪对象列表

HMS\_AREngine\_ARTrackableList\_Destroy(targetList);