Próbuję opracować skaner, który skanuje stronę paszportu za pomocą aparatu.Jak wykryć ograniczenia strony z paszportem za pomocą OpenCV?
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):
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
@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
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