Détection de la carte D'identité nationale et obtention des détails
j'essaie de détecter L'ID National du type ci-dessous et d'obtenir les détails de celui-ci, par exemple l'emplacement de la signature doit être trouvé dans le coin supérieur droit de l'image de la personne, dans ce cas "BC".
j'ai besoin de faire cette application iphone. J'ai pensé utiliser Opencv pour cela, mais comment puis-je obtenir les détails marqués? Ai-je besoin de former l'application avec des cartes semblables ou OCR pourrait aider?
Est-il implémentations spécifiques pour les applications mobiles?
je suis aussi passé par card-io qui détecte les détails de la carte de crédit, est-ce que Card-io détecte aussi les autres détails de la carte?
mise à Jour:
j'ai utilisé tesseract pour la détection de textes. Tesseract fonctionne bien si l'image n'a que du texte. Donc j'ai recadré les régions marquées en rouge et donné comme entrée à Tesseract, ça marche bien avec la partie MRZ.
il y a un IOS la mise en œuvre pour Tesseract, avec qui j'ai testé.
Ce que je dois faire?
maintenant j'essaie d'automatiser la partie de détection de texte. Maintenant, j'ai l'intention d'automatiser les éléments suivants,
1) Couper le visage ( J'ai fait en utilisant le détecteur de visage Viola-jones).
2) besoin de prendre L'initiale dans cet exemple "BC" de la Photo.
3) extraire/détecter la région MRZ de la carte D'identité.
je suis en train de do 2 & 3, N'importe quelles idées ou des morceaux de code seraient grands.
3 réponses
en supposant que ces ID soient préparés selon un modèle standard ayant des largeurs, des hauteurs, des décalages, etc. spécifiques., vous pouvez essayer un modèle.
MRZ serait facile à détecter. Une fois que vous le détectez dans l'image, trouvez la transformation qui relie la MRZ dans votre modèle à elle. Lorsque vous connaissez cette transformation, vous pouvez cartographier n'importe quelle région sur votre modèle (par exemple, la photo de l'individu) à l'image et extraire cette région.
ci-dessous est un programme très simple qui suit un chemin heureux. Vous devrez faire plus de traitement pour localiser le MRZ en général (par exemple, s'il y a des déformations de perspective ou des rotations). J'ai préparé le modèle juste en mesurant l'image, et ça ne marchera pas pour votre affaire. Je voulais juste exprimer l'idée. L'Image a été prise à partir de wiki
Mat rgb = imread(INPUT_FILE);
Mat gray;
cvtColor(rgb, gray, CV_BGR2GRAY);
Mat grad;
Mat morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
morphologyEx(gray, grad, MORPH_GRADIENT, morphKernel);
Mat bw;
threshold(grad, bw, 0.0, 255.0, THRESH_BINARY | THRESH_OTSU);
// connect horizontally oriented regions
Mat connected;
morphKernel = getStructuringElement(MORPH_RECT, Size(9, 1));
morphologyEx(bw, connected, MORPH_CLOSE, morphKernel);
// find contours
Mat mask = Mat::zeros(bw.size(), CV_8UC1);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(connected, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<Rect> mrz;
double r = 0;
// filter contours
for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
{
Rect rect = boundingRect(contours[idx]);
r = rect.height ? (double)(rect.width/rect.height) : 0;
if ((rect.width > connected.cols * .7) && /* filter from rect width */
(r > 25) && /* filter from width:hight ratio */
(r < 36) /* filter from width:hight ratio */
)
{
mrz.push_back(rect);
rectangle(rgb, rect, Scalar(0, 255, 0), 1);
}
else
{
rectangle(rgb, rect, Scalar(0, 0, 255), 1);
}
}
if (2 == mrz.size())
{
// just assume we have found the two data strips in MRZ and combine them
CvRect max = cvMaxRect(&(CvRect)mrz[0], &(CvRect)mrz[1]);
rectangle(rgb, max, Scalar(255, 0, 0), 2); // draw the MRZ
vector<Point2f> mrzSrc;
vector<Point2f> mrzDst;
// MRZ region in our image
mrzDst.push_back(Point2f((float)max.x, (float)max.y));
mrzDst.push_back(Point2f((float)(max.x+max.width), (float)max.y));
mrzDst.push_back(Point2f((float)(max.x+max.width), (float)(max.y+max.height)));
mrzDst.push_back(Point2f((float)max.x, (float)(max.y+max.height)));
// MRZ in our template
mrzSrc.push_back(Point2f(0.23f, 9.3f));
mrzSrc.push_back(Point2f(18.0f, 9.3f));
mrzSrc.push_back(Point2f(18.0f, 10.9f));
mrzSrc.push_back(Point2f(0.23f, 10.9f));
// find the transformation
Mat t = getPerspectiveTransform(mrzSrc, mrzDst);
// photo region in our template
vector<Point2f> photoSrc;
photoSrc.push_back(Point2f(0.0f, 0.0f));
photoSrc.push_back(Point2f(5.66f, 0.0f));
photoSrc.push_back(Point2f(5.66f, 7.16f));
photoSrc.push_back(Point2f(0.0f, 7.16f));
// surname region in our template
vector<Point2f> surnameSrc;
surnameSrc.push_back(Point2f(6.4f, 0.7f));
surnameSrc.push_back(Point2f(8.96f, 0.7f));
surnameSrc.push_back(Point2f(8.96f, 1.2f));
surnameSrc.push_back(Point2f(6.4f, 1.2f));
vector<Point2f> photoDst(4);
vector<Point2f> surnameDst(4);
// map the regions from our template to image
perspectiveTransform(photoSrc, photoDst, t);
perspectiveTransform(surnameSrc, surnameDst, t);
// draw the mapped regions
for (int i = 0; i < 4; i++)
{
line(rgb, photoDst[i], photoDst[(i+1)%4], Scalar(0,128,255), 2);
}
for (int i = 0; i < 4; i++)
{
line(rgb, surnameDst[i], surnameDst[(i+1)%4], Scalar(0,128,255), 2);
}
}
résultat: régions photo et patronyme en orange. MRZ en bleu.
Card.io est conçu spécifiquement pour les cartes de crédit gaufrées. Ça ne marchera pas pour cette mallette.
il y a maintenant la bibliothèque PassportEye disponible à cet effet. Il n'est pas parfait, mais fonctionne assez bien dans mon expérience:https://pypi.python.org/pypi/PassportEye/