如何发现检测到的脸是真的还是假的



我正在开发一个安全相关项目,需要检查是否检测到任何面部,如果检测到面部则做一些动作,如果未检测到面部则关闭应用程序。

一切都很完美,我使用的是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厘米。然后您可以比较图像并查看:

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

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

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

我希望这对你有帮助。

我在解决类似@YogeshRathi的问题时遇到了挑战。我有一个算法与CV2库(Python)识别人脸从一个安全摄像头。我每隔5秒拍一张照片,算法就会识别挂在墙上的海报上的人脸。

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

如果在一张图片中出现了一个真实的人,我们将有不同数量的矩形(海报里的脸的数量和属于真实的人的脸的数量),所以它们中至少有一个将不同于正在被比较的图片的矩形列表。如果两张图中的矩形相似,我在history字段中放置一个标志,即0。如果有不同的矩形,则标志为1。

将进入缓冲区的图片与缓冲区中的其他图片一一比较。所以当你完成后,你有一个旗帜列表(像这样[0,0,0,1,1])附加到每个图片上。

当图片超出缓冲区时,您计算history字段。如果列表中包含一个0,这意味着至少有一张图片是相同的,所以你可以认为上面没有你需要识别的面孔,因为它只包含海报上的假面孔。

相关内容

  • 没有找到相关文章

最新更新