百度人脸识别Android SDK的坑(离线识别)

https://ai.baidu.com/docs#/Face-Offline-SDK-Android/top

1、用户添加的坑

图像采集的时候不能添加用户,也不能并发添加用户。因为添加用户的时候会用到一个getFeature的函数,这个函数不是完全独立的。并发操作的时候会出现错误。

为什么图像采集的时候不能添加呢? 因为图像采集的时候也用到了getFeature这个函数,然后添加用户的时候也要获取用户的特征。这个时候就会产生冲突

并发添加用户也会产生冲突。

最后我又深入研究了一下代码,发现getFeature等方法都调用了百度SDK的一个native方法。从外部来看这个native方法有2个特点:

  • 线程不安全
  • 这个方法里面的资源调用完了不会马上释放

我的解决方案:图像采集的时候不能添加用户,也不能并发添加用户。添加用户的时候把检测给关了,然后每添加一个用户休眠一下,等待native方法的资源处理完毕

2、相机旋转的理解

我有多个不同型号的设备,然后有的设备的相机是进行了物理旋转的,所以百度SDK的DEMO对这些设备就没啥办法了,然后只能自己看下相机的代码(主要是Camera1)。

  • 1、我们获取图像的时候可以传一个特定的图像宽度和高度给Camera
  • 2、Camera会返回一个指定尺寸的原始图像给我们
  • 3、调用Camera.setDisplayOrientation()可以设置preview里面的图片的显示方向

坑:如果我们把preview的尺寸传给camera,然而camera又是经过物理旋转的。我们需要①调用Camera.setDisplayOrientation()把图片的显示方向转过来
②重新设置preview的长宽。(反正需要保证最后显示的布局的长宽和经过第一步转了一下的图片的长宽一致,这样图片才不会变形)
③我们获取到的原始图片在用人脸识别SDK处理的时候也要做相应的旋转

最后我绝对自己开发相机图片的采集了,因为涉及到两个人脸识别的SDK,而这两个SDK又不能同时激活,所以百度的图片采集的模块在另一个SDK里面就用不到。

下面的图片是我对图片的 拍照预览和储存方向的理解
百度人脸识别Android SDK的坑(离线识别)_第1张图片

3、关于Kotlin的坑

函数调用的时候如果kotlin函数的参数指明是非空的,然后用Java传空的话,kotlin就不会执行这个函数…

你可能感兴趣的:(其他)