需求: 在Unity中使用face++人脸检测结果实现比较复杂的例如2d变脸/3d表情追踪等复杂效果
场景: 复杂AR应用
问题:face++本身的demo都是android的和ios的,需要在unity中做复杂场景时直接使用face++中的 com.facepp.library.OpenglActivity
来做检测的话,需要多做一步工作,就是需要把 android.hardware.Camera 获取的图像装载到 unity 的 texture2d 中,这一步工作比较麻烦(但是理论上这样使用 Texture2D.UpdateExternalTexture(textureid)
这样效率更高一些),并且我的应用场景中需要对摄像机有比较复杂的操作。所以需要在 unity 中直接使用face++sdk的 c++接口。
方案:
- 直接使用 unity webcamtexture 获取摄像机视频流画面
- 直接封装 face++sdk .so 中的 c++接口,在 unity 中调用。
参考资料: face++sdk
在实践过程中发现,主要影响效率的是 mg_facepp.Detect 这个接口,所以首先主要封装此接口:
对应的c#端
其次授权部分的整合:
再次一些其他接口的封装:
webcamtexture
纹理转为byte[] 数组
其中 Unity Texture2D 转 Byte[]数组这有个需要注意的地方
- 效率问题:以上的方法比
EncodingToPNG/EncodingToJPG
效率高,其中直接拷贝内存的方法效率最高。注意获取像素时不要在循环中使用 GetPixel(int,int)
。
- 很多图像处理的接口使用都是
width*height*pixelwidth
的 byte[] 数据长度,所以EncodingToPNG/EncodingToJPG
压缩后的数据是没法使用的,GetRawTextureData
数据可以,但是得是 LoadRawTextureData
或者WWW
加载的 Texture 才可以。
补充:以上仅针对有些基础的同学,如果看了这些还是云里雾里的话,直接邮箱留言我发demo吧。