如何找出检测到的面部是真实的还是假的

Yog*_*thi 12 java android opencv face-recognition face-detection

我正在开发一个与安全相关的项目,需要检查是否检测到任何面部,如果检测到面部然后执行某些操作,如果未检测到面部则关闭应用程序.

一切都是完美的工作,我正在使用SurfaceView它实现,SurfaceHolder.Callback并在开放的相机和相机有一个方法名称是startFaceDetection使用这种方法我检测到脸.

代码供参考

public class SurfaceViewPreview extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder mHolder;
    private Camera mCamera;

    public SurfaceViewPreview(Context context, AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        try {
            if (Camera.getNumberOfCameras() <= 0 || ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED)
                return;

            mCamera = Camera.open(0);
            mCamera.setPreviewDisplay(mHolder);
        } catch (Exception e) {
            e.printStackTrace();
            if (this.mCamera != null) {
                this.mCamera.release();
                this.mCamera = null;
            }
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        if (Camera.getNumberOfCameras() <= 0 || ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED)
            return;
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        if (Camera.getNumberOfCameras() <= 0 || ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED)
            return;

        mCamera.startPreview();
        mCamera.setFaceDetectionListener(new Camera.FaceDetectionListener() {
            @Override
            public void onFaceDetection(Camera.Face[] faces, Camera camera) {
               // face is detected.
            }
        });

        mCamera.startFaceDetection();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,问题,如果任何人类的帖子,如果我显示相机然后检测为人类,但我想要真正的人脸检测而不是假的海报脸.

处理我的要求的可能方法.

1)定期拍摄10张图像并检查所有变化是否相同然后表示静态面(如挂在墙上的海报).

2)写出任何适当的算法,告诉检测到的面部是真人或假脸.

3)任何图书馆都可用,据说人脸真的可用或不可用.

如果有人有想法请建议,如何解决上述问题(任何代码可用,然后与我分享),回复表示赞赏!

如何使用适应学习方式来结束真实与假图片/视频帧.

Pau*_*aul 1

您可以使用视差效果。首先,您从相距 2 厘米的 2 个不同位置拍摄 2 张​​照片。然后你可以比较图像并看到:

*如果它们非常相似(几乎相同),那么图像是二维的并且是海报

*如果它们非常不同,那么它就是 3d Face

另一种方法是使用相机闪光灯。闪光灯会在照片上引起一些反射,这会阻止人们使用视频绕过您的系统,因为屏幕会产生大量眩光,会挡住脸部,从而阻止相机检测脸部。您需要做的就是添加一个闪光灯(最好以 100Hz 的频率闪烁,这样人们看不到它,但它会显示在图片中)

我希望这有帮助:)