2016-10-22 10 views
8

मैं एक स्कैनर विकसित करने की कोशिश कर रहा हूं जो कैमरे के साथ पासपोर्ट के पेज को स्कैन कर सकता है।ओपनसीवी के साथ पासपोर्ट पेज की सीमाओं का पता लगाने के लिए कैसे?

एक पासपोर्ट पेज से

तो इस तरह: Sample passport page

मैं उल्लेखनीय हिस्सा बाहर फसल करना चाहते हैं।

मैंने ओपनसीवी का उपयोग करके एज डिटेक्शन के लिए कोड लिखा है जो समोच्च पाता है और फिर सबसे बड़ा चतुर्भुज का अनुमान लगाता है। अंत में यह छवि के शीर्ष दृश्य प्राप्त करने के लिए एक 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 अलग-अलग किनारों हैं।

लेकिन पासपोर्ट के लिए काम नहीं करता है क्योंकि शीर्ष किनारे विशिष्ट नहीं है।

इनपुट एंड्रॉइड पर कैमरे से लिया जाएगा। कोई विचार मैं पासपोर्ट पेज का पता कैसे लगा सकता हूं? मैं ओपनसीवी 3.1 का उपयोग कर रहा हूँ। Sample 1 Sample 2

+0

आप पर कब्जा की शर्तों के बारे में कोई जानकारी दे सकते हैं: प्रकाश हालत (विशेष रूप से ऊपरी किनारे जहां प्रकाश स्रोत की दिशा किनारे गहरे रंग में आता है या गायब हो जाते हैं पर), कब्जा कोण (कैमरा पासपोर्ट के लंबवत होती है या नहीं), विभिन्न अन्य देश के पासपोर्ट के बारे में क्या है (यूएसए का एक झंडा एक पृष्ठ से दूसरे में गुज़र रहा है), पृष्ठभूमि का उपयोग आप करेंगे? कब्जा करने का कोण मुश्किल होगा क्योंकि आप जमीन पर फ्लैट होने के लिए पासपोर्ट प्रेस नहीं करना चुन सकते हैं (अन्यथा आपका हाथ पासपोर्ट का पर्दाफाश करेगा)। यह पूछने का कारण: आपकी छवियां परीक्षण छवियों नहीं हैं, लेकिन Google से चुने गए हैं? – saurabheights

+0

@ सोराबाइट्स स्कैनर एंड्रॉइड/आईओएस फोन पर इस्तेमाल किया जाना चाहिए। तो कैमरे की गुणवत्ता कम से कम 5 मेगापिक्सल रिजोल्यूशन के साथ मानक स्मार्ट फोन कैमरा होना चाहिए। अच्छी तरह से पर्याप्त प्रकाश की स्थिति माना जाता है (हालांकि कोई विशेष सेटअप आवश्यक नहीं है)। कैमरा पासपोर्ट के लिए बिल्कुल लंबवत नहीं हो सकता है लेकिन करीब होना चाहिए। पृष्ठभूमि पासपोर्ट पृष्ठभूमि की तुलना में अलग (गहरा) होना चाहिए। इसका वाद्ययंत्र कि पासपोर्ट को जमीन पर यथासंभव फ्लैट के रूप में रखा गया है। हां छवियों को Google से लिया जाता है लेकिन समाधान को बेस टेस्ट केस के रूप में इनके साथ काम करना चाहिए। – Mehedi

+0

मेरे पास पासपोर्ट के आयाम के साथ फिटिंग के साथ कैनी एंड हफ़ के उपयोग जैसे कुछ प्रारंभिक विचार हैं। हौफ ट्रांसफॉर्म से ऊर्ध्वाधर/नज़दीकी लंबवत रेखाओं पर विचार करें और क्षैतिज के लिए ऐसा ही करें। क्षैतिज किनारे और ऊर्ध्वाधर किनारे का एक परिप्रेक्ष्य परिवर्तन आपको एक आयताकार छवि प्राप्त कर लेना चाहिए। आयाम पासपोर्ट के शीर्ष किनारे से मुद्दों में मदद करेगा। अंतिम पॉली-फिट अंतिम कार्य करना चाहिए। पृष्ठभूमि और पासपोर्ट (हल्के रंग और आमतौर पर केंद्र में) के बीच रंग विभाजन भी उपयोगी हो सकता है, लेकिन विभिन्न देशों के पासपोर्ट के बीच भिन्नता के साथ, यह त्रुटि-प्रवण हो सकता है। – saurabheights

उत्तर

5

अगर आप पासपोर्ट (क्षेत्र के Machine Readable Zone (MRZ) में लाल रंग में उल्लिखित पता लगा सकते हैं पेज को निकालने के लिए संभव हो जाएगा:

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

मान लीजिए कि एक मानक टेम्पलेट (यानी, पेज के लिए पहलू अनुपात, एमआरजेड, फ़ील्ड के लिए ऑफ़सेट आदि) मानते हैं कि पासपोर्ट तैयार होने के बाद, एमआरजेड का पता लगाने के बाद, पृष्ठ का पता लगाना आसान है सीमाओं और अन्य क्षेत्रों जैसे कि टेम्पलेट छवि में दिखाए गए व्यक्ति की तस्वीर जहां एमआरजेड लाल रंग में उल्लिखित है और पृष्ठ सीमा हरे रंग में उल्लिखित है। यह माना जाता है कि कोई परिप्रेक्ष्य विकृति नहीं है। अगर ऐसा विकृति है, तो पहले आपको इसे सही करना चाहिए और फिर टेम्पलेट को लागू करना चाहिए। आप एमआरजेड क्षेत्र के पहलू अनुपात को जानते हुए विकृति को सही करने के लिए एमआरजेड का उपयोग कर सकते हैं।

टेम्पलेट image से तैयार किया गया टेम्पलेट।

template

इस टेम्पलेट मॉडल एक पासपोर्ट से आधारित क्षेत्र निष्कर्षण के एक बहुत ही सरल कार्यान्वयन के लिए चेक here। यह आपकी छवियों के लिए काम नहीं करेगा, और बहुत सारे पैरामीटर ट्यूनिंग की आवश्यकता होगी, इसलिए मैं इसे सीधे उपयोग करने की अनुशंसा नहीं करता हूं। मैं इसे टेम्पलेट-आधारित निष्कर्षण और अन्य प्री-प्रोसेसिंग विधियों के विचार को व्यक्त करने के लिए जिक्र कर रहा हूं।

हालांकि, अगर पासपोर्ट नीचे दी गई छवि में घुमाया गया है (आप देख सकते हैं कि एमआरजेड सीमा सीधे लाइनों का उपयोग नहीं किया जा सकता है), विकृति को सही करना मुश्किल है।

अंत में, यदि आप उच्च रिज़ॉल्यूशन छवियों का उपयोग कर रहे हैं, तो यह एक अच्छा विचार होगा कि उन्हें डाउन नमूना और संसाधित करना क्योंकि यह एक एम्बेडेड सिस्टम पर तेज़ होगा। एक बार जब आप डाउनसमल्ड छवि से एमआरजेड का पता लगा लेते हैं, तो आप कोनों को परिशोधित करने के लिए उच्च-रेज छवि का उपयोग कर सकते हैं। mrz

+0

मैंने एमआरजेड का पता लगाने के विचार का पीछा किया है, लेकिन विकृतियां होने के कारण मुझे पासपोर्ट पेज का शीर्ष दृश्य प्राप्त करने में परेशानी हो रही है, आयत के साथ एक परिप्रेक्ष्य परिवर्तन करना जो पृष्ठ के पहलू अनुपात से अनुमानित है, वह उपज नहीं करता है बहुत अच्छे परिणाम। – Mehedi

+0

@ मेहेदी क्या आपका मतलब है कि आप एमआरजेड की सीमाओं का सही ढंग से पता लगाने में सक्षम हैं, लेकिन एमआरजेड परिप्रेक्ष्य विकृति के अधीन नहीं है, या विरूपण परिप्रेक्ष्य है, फिर भी पृष्ठ सीमाओं का पता लगाने में आप जो त्रुटि करते हैं, वह उच्च है? – dhanushka

+0

मैं एमआरजेड सीमाओं का पता लगा सकता हूं, लेकिन जैसा कि आप देखते हैं कि छवि घुमावदार है (एक घुमावदार परिप्रेक्ष्य है), अगर मैं एमआरजेड समोच्च के बाध्यकारी भाग लेता हूं और उस पृष्ठ से गणना करता हूं जो उस पृष्ठ से गणना करता है, तो मुझे जो छवि मिलती है, टी पूरे पृष्ठ के रूप में है। क्या एमआरजेड चतुर्भुज/समोच्च का उपयोग करके पृष्ठ का शीर्ष दृश्य प्राप्त करने के लिए परिप्रेक्ष्य को रोकने का कोई तरीका है? – Mehedi

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