我们使用人脸检测sdk进行人脸识别的过程大致可以分为下面几个步骤:
- 加载model文件并初始化接口
- 获取授权
- 调用人脸检测获取关键点
- 通知描画关键点
- 释放接口资源
这里的步骤3和4在接收到camera数据后反复执行。我们可以把这几个步骤抽象成数据流来进行封装。face++检测人脸后不断地生成人脸坐标数据,所以整个检测过程就是人脸坐标数据生产的过程,这里与flow的概念对应上了。
face++需要通过处理camera数据来获取人脸关键点,所以camera又是face++人脸检测api的数据提供者。下图体现了数据流动的过程:
看到这里大家也认为我们通过flow实现这个过程更合理了吧!下面我们分步来实现detect flow的创建.
第一步我们通过flow的builder创建一个flow:
private val imageChannel = Channel<FacePPImage>()
flow {
while (currentCoroutineContext().isActive) {
emit(imageChannel.receive())
}
}
这里使用Channel来接收图像数据并发射。在detect flow处理图像数据前我们还需要一些初始化face++的工作,这些工作在onStart中处理。
flow.