2016-10-22 7 views
8

Я пытаюсь разработать сканер, который может сканировать страницу паспорта с камерой.Как определить границы страницы паспорта с помощью OpenCV?

Так со страницы паспорта, как это: Sample passport page

Я хотел бы, чтобы обрезать отмеченную часть.

Я написал код для обнаружения края, используя OpenCV, который находит контуры, а затем аппроксимирует наибольший четырехугольник. Наконец, он делает 4-точечное преобразование перспективы, чтобы получить вид сверху изображения. Код обнаружения края выглядеть следующим образом:

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

этот код работает для отдельных страниц документов удостоверения личности т.е., кредитных карт. Там, где есть 4 различимых края.

Но не работает для паспортов, поскольку верхний край не является таким отличительным.

Входы будут взяты с камеры на Android. Любая идея, как я могу определить страницу паспорта? Я использую OpenCV 3.1.

Вот несколько образцов входов (полученные из Google поиска изображений): Sample 1 Sample 2

+0

Можете ли вы предоставить любую информацию об условиях захвата: Состояние освещения (особенно на верхнем краю, где направление источника света делает край темнее или исчезает), Угол захвата (камера перпендикулярна паспорту или нет), как насчет различных паспортов других стран (у США есть свой флаг, переходящий с одной страницы на другую), фон, который вы будете использовать? Угол захвата будет затруднен, так как вы не можете выбрать, чтобы паспорт был плоским на земле (иначе ваша рука будет закрывать паспорт). Причина в том, чтобы спросить: ваши изображения не являются тестовыми изображениями, а выбраны из Google? – saurabheights

+0

@saurabheights Сканер предполагается использовать на телефонах android/ios. Таким образом, качество камеры должно быть стандартной смарт-камерой с разрешением не менее 5 мегапикселей. Достаточно хорошо освещены условия освещения (однако не требуется специальной настройки). Камера не может быть точно перпендикулярна паспорту, но должна быть закрыта. Предполагается, что фон будет другим (темнее), чем фон паспорта. Его инструмент заключается в том, что паспорт помещен как можно более плоским на землю. Да, изображения взяты из Google, но решение должно работать с ними в качестве базового тестового примера. – Mehedi

+0

У меня есть некоторые начальные мысли, такие как использование Canny & Hough, сопровождаемое соответствием размеру паспорта. Рассмотрим вертикальные/почти вертикальные линии из Hough Transform и сделайте то же самое для Horizontal. Перспективное преобразование горизонтального края и вертикального края должно получить прямоугольное изображение. Измерение поможет в проблемах с верхнего края паспорта. Конечная поли-подгонка должна выполнить конечную задачу. Также может оказаться полезной цветовая сегментация между фоном и паспортом (светлый и обычно в центре), но с изменением паспортов из разных стран он может быть подвержен ошибкам. – saurabheights

ответ

5

можно было бы извлечь страницу, если вы можете найти Machine Readable Zone (MRZ) паспорта (область обведена красным в ниже). Обычно наблюдается очень хороший контраст между MRZ и его фоном, поэтому его можно обнаружить с использованием метода на основе градиента или MSER s.

Предполагая, что существует стандартный шаблон (то есть пропорции для страницы, MRZ, смещения для полей и т. Д.), Согласно которым паспорт готов, после того, как вы найдете MRZ, легко найти страницу границ и других полей, таких как фотография человека, как показано на рисунке шаблона ниже, где MRZ выделена красным цветом, а граница страницы выделена зеленым цветом. Это предполагает отсутствие перспективных искажений. Если есть такое искажение, сначала вы должны исправить его, а затем применить шаблон. Вы можете использовать MRZ для коррекции искажения, поскольку вы знаете соотношение сторон области MRZ.

Шаблон подготовлен с image.

template

Проверить here для очень простой реализации этого шаблона модели извлечения поля на основе из паспорта. Он не будет работать для ваших изображений, и вам потребуется много настроек параметров, поэтому я не рекомендую использовать его сразу. Я имею в виду его просто для того, чтобы передать идею извлечения на основе шаблонов и других методов предварительной обработки.

Однако, если паспорт изогнут, как на изображении ниже (вы можете видеть, что граница MRZ не может быть прослежена с использованием прямых линий), трудно исправить искажение.

И, наконец, если вы используете изображения с высоким разрешением, было бы неплохо скомпенсировать их и обрабатывать, поскольку это было бы быстрее во встроенной системе. После того, как вы найдете MRZ из изображения с пониженной дискретизацией, вы можете использовать изображение с высоким разрешением для уточнения углов.

+0

Я преследовал идею обнаружения MRZ, но, поскольку есть искажения, у меня возникли проблемы с тем, чтобы получить вид сверху страницы паспорта, делая преобразование перспективы с прямоугольником I, приближенным к соотношению сторон страницы, не дает очень хорошие результаты. – Mehedi

+0

@Mehedi Вы имеете в виду, что вы можете правильно определить границы MRZ, но MRZ не подвергается искажению перспективы, или хотя искажение является перспективным, ошибка, которую вы делаете при определении границ страницы, высока? – dhanushka

+0

Я могу определить границы MRZ, но, как вы видите, изображение изогнуто (имеет повернутую точку зрения), если я беру ограничивающий прямоугольник контура MRZ и вычисляю страницу как прямую от этого, изображение, которое я получаю, t содержит всю страницу, как есть. Есть ли способ деформировать перспективу, чтобы получить представление сверху страницы с использованием четырехстороннего/контура MRZ? – Mehedi

 Смежные вопросы

  • Нет связанных вопросов^_^