# 人脸活体检测结果mPixelMap的获取

#### 问题现象

在使用人脸活体检测时，配置routeMode为back模式获取结果后，callback里取到的回调result里没有mPixelMap。

```
interactiveLiveness.startLivenessDetection(routerOptions,
  (err: BusinessError, result: interactiveLiveness.InteractiveLivenessResult | undefined) => {
    if (err.code !== 0 && !result) {
      console.error('startLivenessDetection error')
      return;
    }
    const imagePackerApi: image.ImagePacker = image.createImagePacker();
    let packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };
    console.info(`startLivenessDetection result ${JSON.stringify(result)}`);
    imagePackerApi.packing(this.result?.mPixelMap, packOpts).then((data: ArrayBuffer) => {
      let buf: buffer.Buffer = buffer.from(data);
      this.base64 = 'data:image/jpeg;base64,' + buf.toString('base64', 0, buf.length);
      let parmDic: Map<string, string> = new Map();
      parmDic['WsType'] = '2';
      parmDic['states'] = 'success';
      parmDic['FacePhoto'] = this.base64;
      console.info(`startLivenessDetection parmDic ${JSON.stringify(parmDic)}`);
    })
  })
```

打印结果如下：

```
09-05 14:01:22.926 21147-21147 A03D00/JSAPP com.examp..._harmony I startLivenessDetection result {"livenessType":0,"mPixelMap":{}}
```

#### 背景知识

人脸活体检测API中InteractiveLivenessResult为返回人脸活体检测结果的相关参数，其中包含mPixelMap对象，该对象表示检测成功后返回最具有活体特征的图片，类型为image.PixelMap。

#### 解决方案

PixelMap对象不是标准的JS对象，而是HarmonyOS提供的图像对象，所以无法使用JSON.stringify打印，可以通过Image组件验证是否可以正确显示图片。

#### 常见FAQ

Q：HarmonyOS提供的活体检测能力，是否会输出照片？

A：活体检测返回校验结果和一张活体照片。

Q：活体检测和人脸识别是需要通过华为服务器进行数据处理然后返回，还是通过手机本身进行处理判断的？如果是发送用户数据到华为服务器，是否能私有化到我们本地服务器，不走华为侧？

A：人脸活体检测是端侧的，不存在远程服务器，数据不保存不上传云端。

Q：HarmonyOS活体检测是否支持公安比对能力？

A：当前活体检测检测成功之后会返回最具有活体特征的图片，公安对比能力需开发者自行拿图片进行后续操作。

Q：活体检测返回的图片，人脸部分是蓝色的，后端无法识别，是什么原因？

A：出现偏蓝的情况可能是因为光线、相机曝光等原因导致的，可以尝试以下方法解决：

1.  调整光线：将环境光线调整到适宜的亮度，避免过暗或过亮的情况。
2.  调整相机曝光：可以尝试调整相机曝光参数，使得拍摄的图片更加清晰明亮。

Q：getInteractiveLivenessResult和startLivenessDetection都可以获取检测结果，一个是Promise回调一个是使用callback回调获取检测结果，有什么区别？

A：startLivenessDetection的callback回调函数当前只适用于RouteRedirectionMode.BACK\_MODE跳转模式。如果是RouteRedirectionMode.REPLACE\_MODE模式需要使用getInteractiveLivenessResult，参考人脸活体检测开发实例。