मैं एक स्कैनर विकसित करने की कोशिश कर रहा हूं जो कैमरे के साथ पासपोर्ट के पेज को स्कैन कर सकता है।ओपनसीवी के साथ पासपोर्ट पेज की सीमाओं का पता लगाने के लिए कैसे?
एक पासपोर्ट पेज सेमैं उल्लेखनीय हिस्सा बाहर फसल करना चाहते हैं।
मैंने ओपनसीवी का उपयोग करके एज डिटेक्शन के लिए कोड लिखा है जो समोच्च पाता है और फिर सबसे बड़ा चतुर्भुज का अनुमान लगाता है। अंत में यह छवि के शीर्ष दृश्य प्राप्त करने के लिए एक 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 का उपयोग कर रहा हूँ।
आप पर कब्जा की शर्तों के बारे में कोई जानकारी दे सकते हैं: प्रकाश हालत (विशेष रूप से ऊपरी किनारे जहां प्रकाश स्रोत की दिशा किनारे गहरे रंग में आता है या गायब हो जाते हैं पर), कब्जा कोण (कैमरा पासपोर्ट के लंबवत होती है या नहीं), विभिन्न अन्य देश के पासपोर्ट के बारे में क्या है (यूएसए का एक झंडा एक पृष्ठ से दूसरे में गुज़र रहा है), पृष्ठभूमि का उपयोग आप करेंगे? कब्जा करने का कोण मुश्किल होगा क्योंकि आप जमीन पर फ्लैट होने के लिए पासपोर्ट प्रेस नहीं करना चुन सकते हैं (अन्यथा आपका हाथ पासपोर्ट का पर्दाफाश करेगा)। यह पूछने का कारण: आपकी छवियां परीक्षण छवियों नहीं हैं, लेकिन Google से चुने गए हैं? – saurabheights
@ सोराबाइट्स स्कैनर एंड्रॉइड/आईओएस फोन पर इस्तेमाल किया जाना चाहिए। तो कैमरे की गुणवत्ता कम से कम 5 मेगापिक्सल रिजोल्यूशन के साथ मानक स्मार्ट फोन कैमरा होना चाहिए। अच्छी तरह से पर्याप्त प्रकाश की स्थिति माना जाता है (हालांकि कोई विशेष सेटअप आवश्यक नहीं है)। कैमरा पासपोर्ट के लिए बिल्कुल लंबवत नहीं हो सकता है लेकिन करीब होना चाहिए। पृष्ठभूमि पासपोर्ट पृष्ठभूमि की तुलना में अलग (गहरा) होना चाहिए। इसका वाद्ययंत्र कि पासपोर्ट को जमीन पर यथासंभव फ्लैट के रूप में रखा गया है। हां छवियों को Google से लिया जाता है लेकिन समाधान को बेस टेस्ट केस के रूप में इनके साथ काम करना चाहिए। – Mehedi
मेरे पास पासपोर्ट के आयाम के साथ फिटिंग के साथ कैनी एंड हफ़ के उपयोग जैसे कुछ प्रारंभिक विचार हैं। हौफ ट्रांसफॉर्म से ऊर्ध्वाधर/नज़दीकी लंबवत रेखाओं पर विचार करें और क्षैतिज के लिए ऐसा ही करें। क्षैतिज किनारे और ऊर्ध्वाधर किनारे का एक परिप्रेक्ष्य परिवर्तन आपको एक आयताकार छवि प्राप्त कर लेना चाहिए। आयाम पासपोर्ट के शीर्ष किनारे से मुद्दों में मदद करेगा। अंतिम पॉली-फिट अंतिम कार्य करना चाहिए। पृष्ठभूमि और पासपोर्ट (हल्के रंग और आमतौर पर केंद्र में) के बीच रंग विभाजन भी उपयोगी हो सकता है, लेकिन विभिन्न देशों के पासपोर्ट के बीच भिन्नता के साथ, यह त्रुटि-प्रवण हो सकता है। – saurabheights