我正在开发一个与安全相关的项目,需要检查是否检测到任何面部,如果检测到面部然后执行某些操作,如果未检测到面部,则关闭应用程序。
一切都很完美,我正在使用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)任何图书馆都可用,据说人脸真的可用或不可用。
如果有任何想法请建议,如何解决上述问题(任何代码可用然后与我分享),回复表示赞赏!
如何使用适应性学习方式来推断真实与虚假的图片/视频帧。
答案 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,则意味着至少有一幅相同的图片,因此您可以考虑不必识别任何人脸,因为所有人都只包含海报中的假人。>