android - 如何在 android 中使用 Google 视觉 API 检测眨眼?

标签 android google-play-services google-vision android-vision

我正在使用视觉 API 进行人脸检测,现在我想实现眨眼,但视觉 API 仍然检测到人(非实时)图像(照片)中的眨眼。

此外,我正在使用跟踪器跟踪眼睛随时间的状态,以检测指示左眼眨眼的事件序列:

左眼睁开-> 左眼闭上-> 左眼睁开

GraphicFaceTracker 类定义如下:

private class GraphicFaceTracker extends Tracker<Face> {
        private GraphicOverlay mOverlay;
        private FaceGraphic mFaceGraphic;
        private Context context ;

        GraphicFaceTracker(Context context, GraphicOverlay overlay) {
            mOverlay = overlay;
            this.context= context;
            mFaceGraphic = new FaceGraphic(overlay);
        }

        private final float OPEN_THRESHOLD = 0.85f;
        private final float CLOSE_THRESHOLD = 0.4f;

        private int state = 0;


        void blink(float value, final int eyeNo, String whichEye) {
            switch (state) {
                case 0:
                    if (value > OPEN_THRESHOLD) {
                        // Both eyes are initially open
                        state = 1;
                    }
                    break;

                case 1:
                    if (value < CLOSE_THRESHOLD ) {
                        // Both eyes become closed
                        state = 2;
                    }
                    break;

                case 2:
                    if (value > OPEN_THRESHOLD)  {
                        // Both eyes are open again
                        Log.i("BlinkTracker", "blink occurred!");

                        mCameraSource.takePicture(null, new CameraSource.PictureCallback() {
                            @Override
                            public void onPictureTaken(byte[] bytes) {
                                Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                                Log.d("BITMAP", bmp.getWidth() + "x" + bmp.getHeight());
                                System.out.println(bmp.getWidth() + "x" + bmp.getHeight());
                            }
                        });
                        state = 0;
                    }
                    break;
            }


        }

        /**
         * Start tracking the detected face instance within the face overlay.
         */
        @Override
        public void onNewItem(int faceId, Face item) {
            mFaceGraphic.setId(faceId);
        }

        /**
         * Update the position/characteristics of the face within the overlay.
         */
        @Override
        public void onUpdate(FaceDetector.Detections<Face> detectionResults, Face face) {
            mOverlay.add(mFaceGraphic);
            mFaceGraphic.updateFace(face);

            float left = face.getIsLeftEyeOpenProbability();
            float right = face.getIsRightEyeOpenProbability();
            if (left == Face.UNCOMPUTED_PROBABILITY)  {
                // At least one of the eyes was not detected.
                return;
            }
            blink(left,0,"left");

            if(right == Face.UNCOMPUTED_PROBABILITY ){
                return ;
            }
        }
}

我启用了“分类”,以便让检测器指示眼睛是睁开还是闭上:

FaceDetector detector = new FaceDetector.Builder(context)
            .setProminentFaceOnly(true) // optimize for single, relatively large face
            .setTrackingEnabled(true) // enable face tracking
            .setClassificationType(/* eyes open and smile */ FaceDetector.ALL_CLASSIFICATIONS)
            .setMode(FaceDetector.FAST_MODE) // for one face this is OK
            .build();

然后添加跟踪器作为处理器,用于接收来自检测器的人脸更新。例如,此配置将用于跟踪视野中最大的人脸是否眨眼:

Tracker<Face> tracker = new GraphicFaceTracker(this,mGraphicOverlay);
detector.setProcessor(new LargestFaceFocusingProcessor.Builder(detector, tracker).build());

但是上面的代码检测了人像中的眨眼。但是一个人的形象是不能眨眼的。如何通过相机检测眨眼?

最佳答案

从 Face 对象你可以得到下面的概率。

 float leftOpenScore = face.getIsLeftEyeOpenProbability();
if (leftOpenScore == Face.UNCOMPUTED_PROBABILITY) {//left eye is open }else{//left eye closed }

 float leftOpenScore = face.getIsRightEyeOpenProbability();
if (leftOpenScore == Face.UNCOMPUTED_PROBABILITY) {//Right eye is open }else{//Right eye closed }

现在你可以在你想使用的地方传递这个值。

关于android - 如何在 android 中使用 Google 视觉 API 检测眨眼?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44019872/

相关文章:

android - 我的应用程序新更新后出现 907 错误

android - OSS 许可证插件不包含库模块许可证

未触发 Android 地理围栏 API BroadcastReceiver

android - 谷歌移动愿景在中国不起作用

android - 在 Android 中使用 Git

android - 使用特定语言环境中的字符串从默认语言环境获取字符串

android - 适用于 Android 的计算机视觉和 AR 库?

android - 使用面部检测 API 在 Nose 底部绘制文本

android - 如何以编程方式更改可绘制资源的背景颜色

android - 为什么 OpenCV4Android 的 pointPolygonTest() 方法为每个像素返回-1?