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".

enter image description here

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.

16
demandé sur 2vision2 2014-06-16 19:09:11

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. enter image description here

18
répondu dhanushka 2014-06-28 08:13:18

Card.io est conçu spécifiquement pour les cartes de crédit gaufrées. Ça ne marchera pas pour cette mallette.

3
répondu tomwhipple 2014-06-16 21:47:33

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/

2
répondu user1747134 2016-09-30 09:27:59