मानते हैं कि इन आईडी को मानक चौड़ाई, ऊंचाइयों, ऑफसेट्स, स्पेसिंग इत्यादि वाले मानक टेम्पलेट के अनुसार तैयार किया गया है, आप टेम्पलेट आधारित दृष्टिकोण को आजमा सकते हैं।
एमआरजेड का पता लगाना आसान होगा। एक बार जब आप छवि में इसका पता लगा लेते हैं, तो उस परिवर्तन को ढूंढें जो आपके टेम्पलेट में एमआरजेड को मैप करता है। जब आप इस परिवर्तन को जानते हैं तो आप छवि के लिए अपने टेम्पलेट (उदाहरण के लिए, व्यक्ति की तस्वीर) पर किसी भी क्षेत्र को मानचित्र कर सकते हैं और उस क्षेत्र को निकाल सकते हैं।
नीचे एक बहुत ही सरल कार्यक्रम है जो एक खुश पथ का पालन करता है। आपको सामान्य रूप से एमआरजेड का पता लगाने के लिए और अधिक प्रसंस्करण करना होगा (उदाहरण के लिए, यदि परिप्रेक्ष्य विकृतियां या घूर्णन हैं)। मैंने छवि को मापकर टेम्पलेट तैयार किया है, और यह आपके मामले के लिए काम नहीं करेगा। मैं सिर्फ विचार व्यक्त करना चाहता था। नारंगी में तस्वीर और उपनाम क्षेत्रों: छवि से 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);
}
}
परिणाम लिया गया था। नीले रंग में एमआरजेड।
यदि यह वास्तविक व्यक्ति है, तो मुझे उम्मीद है कि एंटोनी को वेब पर पोस्ट करने के लिए वेब पर पोस्ट नहीं किया जाएगा! – QED
क्या आप आईडी से डेटा निकालना चाहते हैं? मुझे लगता है कि आपको आवश्यक सभी डेटा एमआरजेड में मिल सकते हैं, इसलिए मुद्दा एमआरजेड मान्यता है, क्या मैं सही हूँ? –
@Vitalik आप सही हैं, मैंने एमआरजेड में सामग्री को नोटिस नहीं किया। उत्तर के लिए धन्यवाद। एमआरजेड भाग अकेले खोजने पर कोई विचार, मैं एमआरजेड भाग को खोजने के लिए स्क्वायर डिटेक्शन का प्रयास करने की योजना बना रहा हूं। क्या यह कसरत करेगा? – 2vision2