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

时间:2016-08-17 12:54:28

标签: java android opencv face-detection face-recognition

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

一切都很完美,我正在使用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();
    }
}

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

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

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

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

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

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

如何使用适应性学习方式来推断真实与虚假的图片/视频帧。

2 个答案:

答案 0 :(得分:1)

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

*如果它们非常相似(几乎相同)那么图像是2d并且它是海报

*如果它们非常不同则是3d Face

另一种方法是使用相机闪光灯。闪光灯会对照片产生一些反射,这会阻止人们使用视频绕过你的系统,因为屏幕会导致大量的眩光会阻挡脸部阻止相机检测到脸部。您需要做的就是添加闪光灯(最好以100Hz的速度闪烁,这样人们就无法看到它,但它会出现在图片中)

我希望这有助于:)

答案 1 :(得分:0)

在解决类似@YogeshRathi的问题时,我遇到了挑战。我有一个带有CV2库(Python)的算法,可以识别从安全摄像机拍摄的面部。 我每5秒钟拍照一次,算法就会识别出海报上悬挂在墙上的人脸。

在测试了不同的解决方案(其他算法,训练模型...)之后,我最终要做的是生成一个缓冲区,其中始终有5张图片,一进一出。一个进入缓冲区的对象将使用包含一个面(图片中的5个面-> 5个矩形)的所有矩形的坐标列表进行处理,并将其与缓冲区中的其余图片进行比较。 图片的比较包括通过减去每个单个坐标来比较两个图片之间的矩形(每个矩形都有4个坐标)。如果矩形是静态的(海报中的一张脸在不同的图片中具有几乎相同的矩形),则两个矩形之间的差异是相似的,因此,除非它们具有不同数量的矩形,否则如果两个图片中的所有矩形都具有相似的差异,则它们相似。

如果在图片中出现一个真实的人,我们将有不同数量的矩形(海报中的面孔数量和属于该真实人的面孔的数量),或者至少其中一个与列表不同。图片的矩形正在与之比较。 如果两个图片中的矩形相似,则在“历史记录”字段中放置一个标记,即0。如果存在不同的矩形,则标记为1。

您将进入缓冲区的图片与缓冲区中的其余图片一一比较。因此,完成后,您将在每张图片上附加一个标志列表(例如[0,0,0,1,1])。

当图片超出缓冲区时,您将评估“历史记录”字段。如果列表中包含0,则意味着至少有一幅相同的图片,因此您可以考虑不必识别任何人脸,因为所有人都只包含海报中的假人。