Java 如何识别检测出的人脸是真是假

Java 如何识别检测出的人脸是真是假,java,android,opencv,face-detection,face-recognition,Java,Android,Opencv,Face Detection,Face Recognition,我正在开发一个与安全相关的项目,需要检查是否检测到任何人脸,如果检测到人脸,则执行一些操作,如果未检测到人脸,则关闭应用程序 一切都很好,我正在使用SurfaceView,它是SurfaceHolder.Callback实现的,在打开的摄像头和摄像头中有一个方法名为startFaceDetection使用此方法我检测人脸 参考代码 公共类SurfaceViewPreview扩展了SurfaceView实现了SurfaceHolder.Callback{ 私人地勤人员; 私人摄像机麦卡梅拉; pu

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

一切都很好,我正在使用
SurfaceView
,它是
SurfaceHolder.Callback
实现的,在打开的摄像头和摄像头中有一个方法名为
startFaceDetection
使用此方法我检测人脸

参考代码

公共类SurfaceViewPreview扩展了SurfaceView实现了SurfaceHolder.Callback{
私人地勤人员;
私人摄像机麦卡梅拉;
public SurfaceViewPreview(上下文、属性集属性){
超级(上下文,attrs);
setWillNotDraw(假);
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE\u TYPE\u PUSH\u缓冲区);
}
已创建的公共空白表面(表面持有人){
试一试{

如果(Camera.getNumberOfCameras(),您可以使用视差效果。首先,您可以从相隔2厘米的两个不同位置拍摄两张照片。然后您可以比较图像并查看:

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

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

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


我希望这能有所帮助:)

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

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

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

将进入缓冲区的图片与缓冲区中的其他图片一一进行比较。因此,完成后,每个图片都会附加一个标记列表(如[0,0,0,1,1])


当图片从缓冲器中出来时,你就要对历史字段进行评估。如果列表中包含了0,那么至少意味着有一张图片是相同的,所以你可以考虑没有识别的脸,因为它只包含海报上的假脸。

你尝试过你的“可能的方法”吗??你想如何从视频中检测假脸?我们如何使用自适应学习方法来总结真实与假图片/视频帧。我不想从视频中检测,我想从摄像机中检测,继续摄像机将运行并检查是否检测到人脸。你可以进行瞳孔和虹膜检测,并在分类器中验证。很难确定在脸上假装眼睛。我不认为用几行代码就能解决这个问题。你需要大量的图像分析知识才能达到你能看到的目标。引用:"许多看似静止的场景包含肉眼看不见的细微变化。但是,通过使用我们开发的算法,可以从视频中提取这些小变化。我们给出了一种通过放大这些小变化来可视化这些小变化的方法,并提出了从这些视频中提取有趣信号的算法deos,例如人体脉搏、振动物体发出的声音和热空气的运动。”@Mika two cameras足够了。在两个摄像头前从两个预定义角度同步同一个人的两个视频真的很难。如果你能添加一些闪光想法的参考,我想这对作品会更好。(我自己:P)但是我的相机是静态的,所以怎么能从两个角度拍摄呢locations@Hulk它能旋转哪怕是最小的量吗?@Hulk如果你的相机不能旋转,就用相机闪光灯rotate@GajuKollur但是你需要添加一些黑客逻辑,比如在5秒后捕获2张图像,并检查检测属性是否相同,然后可能是它的图像。但它不是pr操作逻辑。@fluente嗨,谢谢你描述你的方法,有办法联系你吗?你能解释一下为什么你要测量这5张缓冲区图像的矩形吗?如果我做对了,这5张生命面孔的图像将有不同的矩形是的,但假图像应该有大致相同大小的矩形,我说的对吗帽子?但是如果你通过前后移动来改变打印照片的距离呢?Thnx@hxdef用于ans
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();
    }
}