横屏无法识别的问题总结,
最主要的问题是要明白百度人脸识别接口的含义,然后根据他需要的数据格式,来传输对应的数据和配置相应的设置。 针对横屏, 主要有有三个问题点 : (1)宽高是否倒置 (2)旋转角度是否正确 (3)是否是镜像(实测这个影响不大, 不管是不是镜像都能识别出人脸,但是不知道会不会影响识别率)
宽高指的是图片的宽高, 你的设备的 Camera 的 onPreviewFrame 回调中拿到的图像数据, 宽是多少, 高是多少, 然后给接口的时候, 就要反过来, 先传高,再传宽
摄像头输出的数据一般都不是人头正向的, (安卓平台上, 一般是在 Camera 的 onPreviewFrame 回调中拿数据 ) 常见的都是偏向了90度 , 有两种方法可以确认偏向了多少度 :
- 通过安卓的平台接口, Camera.getCameraInfo(mCameraId, info); info.orientation 获得的就是摄像头的旋转角度
- 直接将 Camera 的 onPreviewFrame 回调中的数据(默认是NV21格式)转成jpeg保存到本地, 直接看图片。
然后传给接口的时候, 就要计算一下.比如图片如果需要旋转顺时针旋转270度才能正向 , 就填 270 ; 如果不需要旋转, 就填0
// 小米8手机,人脸直接检测配置 。
//onPreviewFrame出来的图片是额头在右侧, 下巴在左侧,所以需要旋转 270度才能正向 , 所以第四个参数填 270 ;
//然后图片是宽 1280 , 高 640 , 所以第二三个参数分别填 640 和 1280
// BDFaceImageInstance imageInstance = new BDFaceImageInstance(data,
// 640 , 1280,
// BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21,
// 270.0f,
// 1);
// 二代机, 原始数据直接检测配置 。
//onPreviewFrame出来的图片是正向的, 额头在顶上, 下巴在底下,所以不需要旋转 , 所以第四个参数填 0 ;
//然后图片是 宽 1280 , 高 720 所以第二三个参数分别填 720 和 1280
// BDFaceImageInstance imageInstance = new BDFaceImageInstance(data,
// 720 , 1280,
// BDFaceSDKCommon.BDFaceImageType.BDFACE_IMAGE_TYPE_YUV_NV21,
// 0.0f,
// 0); // 1 can
BDFaceImageInstance(byte[] data, int height, int width,BDFaceSDKCommon.BDFaceImageType imageType, float angle, int isMbyteArrayror)
最后一个参数是 《是否是镜像》的意思(isMbyteArrayror 是否镜像), 没搞懂, 可能是便于底层做图片翻转
|