2016-08-17 10 views
12

Pracuję nad jednym projektem związanym z bezpieczeństwem, należy sprawdzić, czy wykryto jakąkolwiek twarz, jeśli wykryto twarz, to wykonaj jakąś czynność, jeśli twarz nie zostanie wykryta, to zamknij aplikację .Jak wykryć wykrytą twarz jest prawdziwa lub fałszywa

Wszystko działa idealnie, używam SurfaceView, który jest zaimplementowany SurfaceHolder.Callback iw tej otwartej kamerze i aparacie ma jedną nazwę metody: startFaceDetection za pomocą tej metody wykrywają twarz.

kod

odsyłające

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(); 
    } 
} 

Teraz problem, jeśli żaden człowiek po gdybym pokazany na aparacie następnie wykrywane jako człowieka, ale chcę prawdziwy ludzki nie wykrywania twarzy fałszywe plakat twarz.

Możliwe postępowanie z moim wymaganiem.

1) Przechwytuj 10 obrazów okresowo i sprawdź, czy wszystkie odmiany są takie same, oznacza to, że jest tam nieruchoma twarz (jak plakat zamontowany w ścianie).

2) Napisz odpowiedni algorytm, który mówi, że wykryta twarz jest prawdziwą ludzką lub fałszywą twarzą.

3) Dostępna jest dowolna biblioteka, która mówi, że ludzka twarz jest naprawdę dostępna.

jeśli ktoś ma pomysł, proszę zasugerować, jak rozwiązać powyższy problem (dowolny kod jest dostępny, a następnie podzielić się ze mną), odpowiedź jest doceniana!

w jaki sposób można zastosować adaptację sposobów uczenia się do zawarcia rzeczywistej lub fałszywej ramki obrazu/wideo.

+0

pan spróbować każdy swoich "możliwych sposobów"? Jak chcesz wykryć fałszywe twarze z wideo? – Micka

+0

, w jaki sposób możemy wykorzystać adaptację sposobów uczenia się do zawarcia rzeczywistej lub fałszywej ramki obrazu/wideo. \t Nie chcę wykrywać z wideo, chcę wykryć z kamery, kontynuuję pracę kamery i sprawdzam czy twarz jest wykrywana czy nie –

+1

możesz wykluczyć źrenicę i tęczówkę i zweryfikować ją w klasyfikatorze ciężko udawać oczy w twarz. Nie wyobrażam sobie, że umieszczenie kilku linii kodu rozwiąże ten problem. Aby osiągnąć ten cel, potrzebujesz dużej wiedzy z zakresu analizy obrazu. –

Odpowiedz

1

Możesz użyć efektu paralaksy. Najpierw robisz 2 zdjęcia z 2 różnych lokalizacji, które są oddalone o 2 cm. następnie można porównać obrazy i zobaczyć:

* Jeśli są one bardzo podobne (prawie to samo), a następnie obraz jest 2d i jest to plakat

* Jeśli są one bardzo różne to jest 3d twarzy

Innym sposobem na zrobienie tego jest użycie lampy błyskowej . Lampa błyskowa spowodowałaby trochę refleksji na zdjęciach, a to uniemożliwiłoby użytkownikom korzystanie z wideo w celu ominięcia systemu, ponieważ ekran powodowałby, że wiele odblasków blokowałoby twarz, uniemożliwiając aparatowi wykrycie twarzy. Wszystko trzeba by zrobić, to dodać błysk (najlepiej miga przy 100Hz tak jak ludzie, nie widać go, ale byłoby to widoczne na zdjęciu)

mam nadzieję, że to pomogło :)

+0

Jeśli możesz dodać pewne odniesienia do tego pomysłu na flash, myślę, że będzie lepiej dla OP. (i ja: P) – Raskayu

+0

Ale mój aparat jest statyczny, więc w jaki sposób można przechwytywać z dwóch lokalizacji –

+0

@Hulk Czy można go obrócić nawet o najmniejszą wartość? – Paul

Powiązane problemy