Cómo detectar los límites de una página de pasaporte con OpenCV?

Estoy tratando de desarrollar un escáner que pueda escanear una página de un pasaporte con la cámara.

Así que desde una página de pasaporte como esta: Ejemplo de página de pasaporte

Me gustaría recortar la parte marcada.

He escrito el código para la detección del borde usando OpenCV que encuentra los contornos y después aproxima el cuadrilátero más grande. Finalmente realiza una transformación en perspectiva de 4 puntos para obtener una vista superior de la imagen. El código de detección de bordes tiene este aspecto:

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

Este código funciona para documentos de una sola página, es decir, tarjetas de identificación, tarjetas de crédito. Donde hay 4 bordes distinguibles.

Pero no funciona para los pasaportes como el borde superior no es tan distintivo.

Las entradas se tomarán de la cámara en Android. ¿Alguna idea de cómo puedo detectar la página del pasaporte? Estoy utilizando OpenCV 3.1.

Estas son algunas entradas de muestra (obtenidas de la búsqueda de imágenes de Google): Muestra 1 Muestra 2

Sería posible extraer la página si usted puede localizar la zona de lectura mecánica (MRZ) del pasaporte (región esbozada en rojo en la imagen de abajo). Por lo general, hay un contraste muy bueno entre el MRZ y su fondo, por lo que se puede detectar mediante un método basado en gradiente o MSER s.

Asumiendo que hay una plantilla estándar (es decir, relaciones de aspecto para la página, MRZ, desplazamientos para los campos, etc.) según el cual se prepara el pasaporte, una vez localizado el MRZ, es fácil localizar los bordes de la página y otros campos Tal como la foto de la persona como se muestra en la imagen de la plantilla debajo donde el MRZ se delinea en rojo y el borde de la página se delinea en verde. Esto es suponer que no hay distorsión perspectiva. Si hay tal distorsión, primero debe corregirla y luego aplicar la plantilla. Puede utilizar el propio MRZ para corregir la distorsión ya que conoce la relación de aspecto de la región MRZ.

Plantilla preparada a partir de la imagen .

modelo

Compruebe aquí una implementación muy sencilla de este modelo basado en modelo de extracción de campo de un pasaporte. No funcionará para tus imágenes, y necesitará mucho ajuste de parámetros, así que no recomiendo usarlo de inmediato. Lo estoy refiriendo simplemente para transmitir la idea de extracción basada en plantillas y otros métodos de preprocesamiento.

Sin embargo, si el pasaporte está curvado como en la imagen de abajo (se puede ver el límite MRZ no se puede rastrear con líneas rectas), es difícil de corregir la distorsión.

Por último, si está utilizando imágenes de alta resolución, sería una buena idea para downsample y procesarlos, ya que sería más rápido en un sistema embebido. Una vez que encuentre el MRZ de la imagen de baja resolución, puede utilizar la imagen de alta resolución para refinar las esquinas. Mrz

  • OpenCV + Eclipse + Android: Error org.opencv.video Video.java
  • OpenGL ES 2 no funciona en Android API23
  • Android Marshmallow - Llamada a un módulo de biblioteca (biblioteca nativa) de otro módulo de biblioteca que se estrelló
  • Explorador de documentos Android con opencv
  • Android4OpenCV: configuración de la resolución al inicio
  • OpenCV se bloquea después de un corto período de tiempo en la aplicación para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.