Я пытаюсь разработать сканер, который может сканировать страницу паспорта с камерой.Как определить границы страницы паспорта с помощью OpenCV?
Так со страницы паспорта, как это:
Я хотел бы, чтобы обрезать отмеченную часть.
Я написал код для обнаружения края, используя 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 поиска изображений):
Можете ли вы предоставить любую информацию об условиях захвата: Состояние освещения (особенно на верхнем краю, где направление источника света делает край темнее или исчезает), Угол захвата (камера перпендикулярна паспорту или нет), как насчет различных паспортов других стран (у США есть свой флаг, переходящий с одной страницы на другую), фон, который вы будете использовать? Угол захвата будет затруднен, так как вы не можете выбрать, чтобы паспорт был плоским на земле (иначе ваша рука будет закрывать паспорт). Причина в том, чтобы спросить: ваши изображения не являются тестовыми изображениями, а выбраны из Google? – saurabheights
@saurabheights Сканер предполагается использовать на телефонах android/ios. Таким образом, качество камеры должно быть стандартной смарт-камерой с разрешением не менее 5 мегапикселей. Достаточно хорошо освещены условия освещения (однако не требуется специальной настройки). Камера не может быть точно перпендикулярна паспорту, но должна быть закрыта. Предполагается, что фон будет другим (темнее), чем фон паспорта. Его инструмент заключается в том, что паспорт помещен как можно более плоским на землю. Да, изображения взяты из Google, но решение должно работать с ними в качестве базового тестового примера. – Mehedi
У меня есть некоторые начальные мысли, такие как использование Canny & Hough, сопровождаемое соответствием размеру паспорта. Рассмотрим вертикальные/почти вертикальные линии из Hough Transform и сделайте то же самое для Horizontal. Перспективное преобразование горизонтального края и вертикального края должно получить прямоугольное изображение. Измерение поможет в проблемах с верхнего края паспорта. Конечная поли-подгонка должна выполнить конечную задачу. Также может оказаться полезной цветовая сегментация между фоном и паспортом (светлый и обычно в центре), но с изменением паспортов из разных стран он может быть подвержен ошибкам. – saurabheights