2014-06-16 6 views
13

मैं नीचे दिए गए प्रकार की राष्ट्रीय आईडी का पता लगाने की कोशिश कर रहा हूं और इसके विवरण प्राप्त कर रहा हूं, उदाहरण के लिए हस्ताक्षर का स्थान व्यक्तियों के छवि के ऊपरी दाएं कोने में पाया जाना चाहिए , इस मामले में "बीसी"।राष्ट्रीय आईडी कार्ड का पता लगाना और विवरण प्राप्त करना

enter image description here

मैं iphone में इस आवेदन करने की जरूरत है। मैंने इसके लिए ओपनसीवी का उपयोग करने के बारे में सोचा लेकिन मैं चिह्नित विवरण कैसे प्राप्त कर सकता हूं? क्या मुझे उसी तरह के कार्ड या ओसीआर के साथ आवेदन को प्रशिक्षित करने की ज़रूरत है?

क्या मोबाइल एप्लिकेशन के लिए कोई विशिष्ट कार्यान्वयन है?

मैं कार्ड-आईओ के माध्यम से भी जाता हूं जो क्रेडिट कार्ड के विवरण का पता लगाता है, क्या कार्ड-आईओ अन्य कार्ड विवरणों का भी पता लगाता है?

अद्यतन:

मैं पाठ पता लगाने के लिए tesseract इस्तेमाल किया है। छवि में अकेले पाठ होने पर टेस्सेक्टैक्ट अच्छा काम करता है। इसलिए मैंने लाल चिह्नित क्षेत्रों को फसल किया और टेस्सेक्ट को इनपुट के रूप में दिया, यह एमआरजेड भाग के साथ अच्छा काम करता है।

टेस्सेरैक्ट के लिए IOS implementation है, जिसके साथ मैंने परीक्षण किया है।

मुझे क्या करना है?

अब मैं पाठ पहचान भाग स्वचालित करने की कोशिश कर रहा हूं। अब मैं निम्नलिखित मदों को स्वचालित करने की योजना बना रहा हूं,

1) फेस फसल (मैंने व्हायोला-जोन्स फेस डिटेक्टर का उपयोग करके किया है)।

2) फोटो से इस उदाहरण "बीसी" में प्रारंभिक लेने की आवश्यकता है।

3) आईडी कार्ड से एमआरजेड क्षेत्र निकालना/पता लगाना।

मैं 2 & 3 करने की कोशिश कर रहा हूं, कोई भी विचार या कोड स्निपेट बहुत अच्छा होगा।

+4

यदि यह वास्तविक व्यक्ति है, तो मुझे उम्मीद है कि एंटोनी को वेब पर पोस्ट करने के लिए वेब पर पोस्ट नहीं किया जाएगा! – QED

+0

क्या आप आईडी से डेटा निकालना चाहते हैं? मुझे लगता है कि आपको आवश्यक सभी डेटा एमआरजेड में मिल सकते हैं, इसलिए मुद्दा एमआरजेड मान्यता है, क्या मैं सही हूँ? –

+0

@Vitalik आप सही हैं, मैंने एमआरजेड में सामग्री को नोटिस नहीं किया। उत्तर के लिए धन्यवाद। एमआरजेड भाग अकेले खोजने पर कोई विचार, मैं एमआरजेड भाग को खोजने के लिए स्क्वायर डिटेक्शन का प्रयास करने की योजना बना रहा हूं। क्या यह कसरत करेगा? – 2vision2

उत्तर

2

कार्ड.io विशेष रूप से उभरा क्रेडिट कार्ड के लिए डिज़ाइन किया गया है। यह इस उपयोग के मामले के लिए काम नहीं करेगा।

+0

उत्तर के लिए धन्यवाद। क्या मैं इस उपयोग के मामले को किसी अन्य तरीके से प्राप्त कर सकता हूं। – 2vision2

+0

पर्याप्त प्रयास के साथ कुछ भी संभव है। ;) मैं यहां शुरू करूंगा: http://stackoverflow.com/questions/3750719/getting-started-in-computervision-road-tracking – tomwhipple

14

मानते हैं कि इन आईडी को मानक चौड़ाई, ऊंचाइयों, ऑफसेट्स, स्पेसिंग इत्यादि वाले मानक टेम्पलेट के अनुसार तैयार किया गया है, आप टेम्पलेट आधारित दृष्टिकोण को आजमा सकते हैं।

एमआरजेड का पता लगाना आसान होगा। एक बार जब आप छवि में इसका पता लगा लेते हैं, तो उस परिवर्तन को ढूंढें जो आपके टेम्पलेट में एमआरजेड को मैप करता है। जब आप इस परिवर्तन को जानते हैं तो आप छवि के लिए अपने टेम्पलेट (उदाहरण के लिए, व्यक्ति की तस्वीर) पर किसी भी क्षेत्र को मानचित्र कर सकते हैं और उस क्षेत्र को निकाल सकते हैं।

नीचे एक बहुत ही सरल कार्यक्रम है जो एक खुश पथ का पालन करता है। आपको सामान्य रूप से एमआरजेड का पता लगाने के लिए और अधिक प्रसंस्करण करना होगा (उदाहरण के लिए, यदि परिप्रेक्ष्य विकृतियां या घूर्णन हैं)। मैंने छवि को मापकर टेम्पलेट तैयार किया है, और यह आपके मामले के लिए काम नहीं करेगा। मैं सिर्फ विचार व्यक्त करना चाहता था। नारंगी में तस्वीर और उपनाम क्षेत्रों: छवि से 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); 
     } 
    } 

परिणाम लिया गया था। नीले रंग में एमआरजेड। enter image description here

2

अब इस उद्देश्य के लिए पासपोर्टई लाइब्रेरी उपलब्ध है। यह सही नहीं है, लेकिन मेरे अनुभव में काफी अच्छा काम करता है: https://pypi.python.org/pypi/PassportEye/

+0

मेरे परीक्षणों और अन्य टिप्पणियों से यहां http://www.pyimagesearch.com/2015/11/30/पता लगाने-मशीन-पठनीय-जोन्स-इन-पासपोर्ट-छवियां/(डॉन देखें), यह मॉड्यूल प्रोड के लिए तैयार नहीं है (इससे दूर) – comte

संबंधित मुद्दे