टेम्पलेट मैचिंग एक तकनीक है, जिसके द्वारा एक पैच या टेम्पलेट को वास्तविक इमेज से मैच किया जा सकता है। यह मूल रूप से एक पैटर्न मैचिंग तंत्र है।
Python में OpenCV मॉड्यूल है। OpenCV का उपयोग करके, हम आसानी से मैच ढूंढ सकते हैं। तो इस समस्या में, OpenCV टेम्पलेट मैचिंग तकनीकों का उपयोग किया जाता है।
OpenCV कार्यक्षमता का उपयोग करने के लिए, हमें pip का उपयोग करके इसे डाउनलोड करना होगा।
sudo pip3 install opencv-python
टेम्पलेट मैचिंग टास्क के लिए, एक सटीकता कारक होता है, जिसे थ्रेशोल्ड के रूप में जाना जाता है। उदाहरण के लिए, हम कह सकते हैं कि हम इस टेम्पलेट मैचिंग समाधान का उपयोग करके आसानी से फेस रिकग्निशन स्कीम बना सकते हैं। हम आंखों या चेहरे के किसी अन्य भाग की कुछ इमेज प्रदान कर सकते हैं, फिर उन इमेज को टेम्पलेट के रूप में उपयोग करके, यह आसानी से मैच ढूंढ सकता है, लेकिन आंखों में अलग-अलग वेरिएशन्स हैं। इसलिए यदि हम सटीकता स्तर को 50% पर सेट करते हैं, तो यह 100% सटीकता स्तर से बेहतर डिटेक्ट करेगा। आमतौर पर, विभिन्न मामलों में सटीकता स्तर 80% होता है।
टेम्पलेट्स मैच करने के चरण
- वास्तविक इमेज लें और इसे ग्रेस्केल इमेज में कन्वर्ट करें।
- टेम्पलेट को ग्रेस्केल इमेज के रूप में लें।
- टेम्पलेट वास्तविक इमेज पर स्लाइड करता है और वह स्थान ढूंढता है जहां सटीकता स्तर मेल खाता है।
- जब परिणाम सटीकता स्तर से अधिक या बराबर होता है, तो उस स्थिति को डिटेक्टेड के रूप में मार्क करें।
पहले मामले के लिए इनपुट इमेज और टेम्पलेट हैं:
मुख्य इमेज

टेम्पलेट

उदाहरण कोड - बेसिक टेम्पलेट मैचिंग
import cv2
import numpy as np
# मुख्य इमेज खोलें और इसे ग्रेस्केल इमेज में कन्वर्ट करें
main_image = cv2.imread('main_image.png')
gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
# टेम्पलेट को ग्रेस्केल इमेज के रूप में खोलें
template = cv2.imread('template1.png', 0)
width, height = template.shape[::-1] # चौड़ाई और ऊंचाई प्राप्त करें
# cv2.matchTemplate का उपयोग करके टेम्पलेट मैच करें
match = cv2.matchTemplate(gray_image, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
position = np.where(match >= threshold) # इमेज में टेम्पलेट का स्थान प्राप्त करें
for point in zip(*position[::-1]):
# मैच्ड टेम्पलेट के चारों ओर रेक्टेंगल ड्रा करें
cv2.rectangle(main_image, point, (point[0] + width, point[1] + height), (0, 204, 153), 0)
cv2.imshow('Template Found', main_image)
cv2.waitKey(0)
आउटपुट

उपरोक्त कोड मल्टी-स्केलिंग को सपोर्ट नहीं करता। इसलिए यदि टेम्पलेट का आकार समान नहीं है, तो यह डिटेक्ट नहीं करेगा। तो अगले भाग में, हम देखेंगे कि मल्टी-स्केलिंग फीचर का उपयोग करके टेम्पलेट्स को कैसे डिटेक्ट किया जा सकता है।
इस दृष्टिकोण में, वास्तविक इमेज को हर बार अलग-अलग आकार में कन्वर्ट किया जाता है, यह पैटर्न से मैच करता है, और मैचों का पता लगाने के लिए सबसे बड़े सहसंबंध गुणांक को ढूंढता है।
यहां वास्तविक इमेज समान है, टेम्पलेट यहां है:

उदाहरण कोड - मल्टी-स्केल टेम्पलेट मैचिंग
import imutils
import cv2
import numpy as np
# टेम्पलेट खोलें और कैननी प्राप्त करें
template = cv2.imread('template3.jpg')
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
template = cv2.Canny(template, 10, 25)
(height, width) = template.shape[:2]
# मुख्य इमेज खोलें और इसे ग्रेस्केल इमेज में कन्वर्ट करें
main_image = cv2.imread('main_image.png')
gray_image = cv2.cvtColor(main_image, cv2.COLOR_BGR2GRAY)
temp_found = None
for scale in np.linspace(0.2, 1.0, 20)[::-1]:
# इमेज को रिसाइज़ करें और अनुपात स्टोर करें
resized_img = imutils.resize(gray_image, width=int(gray_image.shape[1] * scale))
ratio = gray_image.shape[1] / float(resized_img.shape[1])
if resized_img.shape[0] < height or resized_img.shape[1] < width:
break
# चेकिंग के लिए एज्ड इमेज में कन्वर्ट करें
e = cv2.Canny(resized_img, 10, 25)
match = cv2.matchTemplate(e, template, cv2.TM_CCOEFF)
(_, val_max, _, loc_max) = cv2.minMaxLoc(match)
if temp_found is None or val_max > temp_found[0]:
temp_found = (val_max, loc_max, ratio)
# x,y कोऑर्डिनेट की गणना के लिए temp_found से जानकारी प्राप्त करें
(_, loc_max, r) = temp_found
(x_start, y_start) = (int(loc_max[0]), int(loc_max[1]))
(x_end, y_end) = (int((loc_max[0] + width)), int((loc_max[1] + height)))
# टेम्पलेट के चारों ओर रेक्टेंगल ड्रा करें
cv2.rectangle(main_image, (x_start, y_start), (x_end, y_end), (153, 22, 0), 5)
cv2.imshow('Template Found', main_image)
cv2.waitKey(0)
आउटपुट
