2016-10-22 12 views
8

Próbuję opracować skaner, który skanuje stronę paszportu za pomocą aparatu.Jak wykryć ograniczenia strony z paszportem za pomocą OpenCV?

Tak od strony paszportu tak: Sample passport page

Chciałabym przyciąć z zaznaczoną część.

Mam napisany kod do wykrywania krawędzi za pomocą OpenCV, który znajduje kontury, a następnie przybliża największy czworobok. W końcu robi 4-punktową transformację perspektywy, aby uzyskać widok z góry obrazu. Kod wykrywania krawędzi wygląda następująco:

public static List<MatOfPoint> findContours(Mat src){ 
    Mat img = src.clone(); 
    src.release(); 
    //find contours 
    double ratio = getScaleRatio(img.size()); 
    int width = (int) (img.size().width/ratio); 
    int height = (int) (img.size().height/ratio); 
    Size newSize = new Size(width, height); 
    Mat resizedImg = new Mat(newSize, CvType.CV_8UC4); 
    Imgproc.resize(img, resizedImg, newSize); 

    Imgproc.medianBlur(resizedImg, resizedImg, 5); 

    Mat cannedImg = new Mat(newSize, CvType.CV_8UC1); 
    Imgproc.Canny(resizedImg, cannedImg, 70, 200, 3, true); 
    resizedImg.release(); 

    Imgproc.threshold(cannedImg, cannedImg, 200, 255, Imgproc.THRESH_OTSU); 

    Mat dilatedImg = new Mat(newSize, CvType.CV_8UC1); 
    Mat morph = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3)); 
    Imgproc.dilate(cannedImg, dilatedImg, morph, new Point(-1, -1), 2, 1, new Scalar(1)); 
    cannedImg.release(); 
    morph.release(); 

    ArrayList<MatOfPoint> contours = new ArrayList<>(); 
    Mat hierarchy = new Mat(); 
    Imgproc.findContours(dilatedImg, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 
    hierarchy.release(); 

    Log.d(TAG, "contours found: " + contours.size()); 

    Collections.sort(contours, new Comparator<MatOfPoint>() { 
     @Override 
     public int compare(MatOfPoint o1, MatOfPoint o2) { 
      return Double.valueOf(Imgproc.contourArea(o2)).compareTo(Imgproc.contourArea(o1)); 
     } 
    }); 

    return contours; 
} 

for(MatOfPoint contour:contours){ 
     MatOfPoint2f mat = new MatOfPoint2f(contour.toArray()); 
     double peri = Imgproc.arcLength(mat, true); 
     MatOfPoint2f approx = new MatOfPoint2f(); 
     Imgproc.approxPolyDP(mat, approx, 0.02 * peri, true); 

     Point[] points = approx.toArray(); 
     Log.d("SCANNER", "approx size " + points.length); 

     if (points.length == 4) { 
       Point[] spoints = CVProcessor.sortPoints(points); 

       if (CVProcessor.insideArea(spoints, newSize)) { 
         rectContour = contour; 
         foundPoints = spoints; 
         break; 
       } 
     } 
    } 

ten kod działa dla dokumentów jednostronicowych, tj. Kart identyfikacyjnych, kart kredytowych. Gdzie są 4 rozróżnialne krawędzie.

Ale nie działa w przypadku paszportów, ponieważ górna krawędź nie jest tak charakterystyczna.

Dane wejściowe zostaną pobrane z aparatu w systemie Android. Masz pomysł, jak wykryć stronę paszportową? Używam OpenCV 3.1.

Oto kilka wejść próbki (uzyskane z wyszukiwarki grafiki Google): Sample 1 Sample 2

+0

Czy możesz podać informacje o warunkach przechwytywania: Stan światła (szczególnie przy górnej krawędzi, gdzie kierunek źródła światła powoduje przyciemnienie krawędzi lub zniknięcie), Kąt przechwytywania (kamera jest prostopadła do paszportu lub nie), co z różnymi paszportami innych krajów (USA mają flagę przechodzącą z jednej strony na drugą), z którego tła korzystasz? Kąt przechwytywania będzie trudny, ponieważ nie możesz wybrać paszportu, aby był płaski na ziemi (w przeciwnym razie twoja ręka zamknie paszport). Powód, aby zapytać: Twoje obrazy nie są obrazami testowymi, ale wybrane z google? – saurabheights

+0

@saurabheights Skaner powinien być używany na telefonach z systemem Android/ios. Zatem jakość kamery ma być standardową kamerą smartfona o rozdzielczości co najmniej 5 megapikseli. Zakłada się wystarczająco dobre warunki oświetleniowe (nie jest wymagana żadna specjalna konfiguracja). Kamera może nie być dokładnie prostopadła do paszportu, ale powinna być blisko. Tło ma być inne (ciemniejsze) niż tło paszportowe. Jego instrumentarium polega na tym, aby paszport był umieszczony możliwie płasko na ziemi. Tak, obrazy są pobierane z google, ale rozwiązanie powinno działać z nimi jako podstawowym przypadkiem testowym. – Mehedi

+0

Mam kilka początkowych myśli, takich jak wykorzystanie Canny & Hough, wraz z dopasowaniem do wymiaru paszportu. Rozważ pionowe/prawie pionowe linie z transformacji Hough i wykonaj to samo dla poziomego. Przekształcenie perspektywy poziomej i pionowej powinno dać prostokątny obraz. Wymiar pomoże w problemach z górnej krawędzi paszportu. Końcowy poli-fit powinien wykonać ostatnie zadanie. Pomóc może również podział kolorów między tłem a paszportem (jasny kolor i zwykle w środku), ale z różnicami między paszportami z różnych krajów, może to być podatne na błędy. – saurabheights

Odpowiedz

5

Byłoby to możliwe, aby wyodrębnić strony, czy można zlokalizować Machine Readable Zone (MRZ) paszportu (region przedstawione w kolorze czerwonym w zdjęcie poniżej). Zwykle istnieje bardzo dobry kontrast pomiędzy MRZ i jego tłem, więc można go wykryć za pomocą metody opartej na gradiencie lub MSER s.

Zakładając, że istnieje standardowy szablon (tj. Współczynniki proporcji dla strony, MRZ, przesunięcia dla pól itp.), Według których przygotowywany jest paszport, po zlokalizowaniu MRZ łatwo jest zlokalizować stronę granice i inne pola, takie jak zdjęcie osoby, jak pokazano na poniższym obrazie szablonu, gdzie MRZ jest zaznaczone na czerwono, a krawędź strony jest zaznaczona na zielono. Zakłada to brak zniekształceń perspektywy. Jeśli występuje takie zniekształcenie, najpierw należy je poprawić, a następnie zastosować szablon. Możesz użyć samego MRZ do korekcji zniekształceń, tak jak znasz współczynnik kształtu obszaru MRZ.

Szablon przygotowany z image.

template

Sprawdź here z bardzo prostego wdrożenia tego modelu szablon wydobycia z pola na podstawie paszportu. To nie zadziała dla twoich obrazów i będzie wymagało wielu ustawień parametrów, więc nie polecam używania go od razu. Mówię o tym tylko po to, aby przekazać ideę ekstrakcji opartej na szablonach i innych metodach przetwarzania wstępnego.

Jeśli jednak paszport jest zakrzywiony jak na poniższym obrazku (można zauważyć, że granica MRZ nie może być śledzona za pomocą linii prostych), trudno jest skorygować zniekształcenie.

Wreszcie, jeśli używasz obrazów o wysokiej rozdzielczości, dobrym pomysłem byłoby poddanie ich próbom i przetworzeniu, tak jak byłoby to szybsze w systemie wbudowanym. Po zlokalizowaniu MRZ ze zmniejszonego obrazu możesz użyć obrazu o wysokiej rozdzielczości, aby zawęzić rogi. mrz

+0

Szukałem idei wykrywania MRZ, ale ponieważ występują zniekształcenia, mam problem z uzyskaniem widoku z góry strony z paszportem, wykonanie transformacji perspektywy przy pomocy prostokąta, który przybliżono do proporcji strony, nie powoduje bardzo dobre wyniki. – Mehedi

+0

@Mehedi Czy masz na myśli to, że jesteś w stanie poprawnie wykryć granice MRZ, ale MRZ nie podlega zniekształceniu perspektywy, lub jeśli zniekształcenie jest perspektywiczne, błąd jaki popełniłeś wykrywając granice strony jest wysoki? – dhanushka

+0

Mogę wykryć granice MRZ, ale jak widzisz, obraz jest zakrzywiony (ma obróconą perspektywę), jeśli wziąłem prostokąt prostokąta konturu MRZ i obliczyłem z nim stronę jako prostą, obraz, który otrzymuję, nie robi ". t zawiera całą stronę taką jaka jest. Czy istnieje sposób na wypaczenie perspektywy, aby uzyskać widok z góry strony za pomocą kwadratu/konturu MRZ? – Mehedi

Powiązane problemy