টেমপ্লেট ম্যাচিং হলো একটি টেকনিক, যার মাধ্যমে একটি প্যাচ বা টেমপ্লেট একটি একচুটি ইমেজ থেকে ম্যাচ করা যায়। এটি মূলত একটি প্যাটার্ন ম্যাচিং মেকানিজম।
পাইথনে OpenCV মডিউল রয়েছে। OpenCV ব্যবহার করে আমরা সহজে ম্যাচটি খুঁজে বের করতে পারি। তাই এই সমস্যায়, OpenCV টেমপ্লেট ম্যাচিং টেকনিকগুলো ব্যবহার করা হয়েছে।
OpenCV ফাংশনালিটি ব্যবহার করতে, pip ব্যবহার করে ডাউনলোড করতে হবে।
sudo pip3 install opencv-python
টেমপ্লেট ম্যাচিং টাস্কের জন্য একটি অ্যাকিউরেসি ফ্যাক্টর রয়েছে, এই ফ্যাক্টরকে থ্রেশহোল্ড বলা হয়। উদাহরণস্বরূপ, আমরা বলতে পারি এই টেমপ্লেট ম্যাচিং সমাধান ব্যবহার করে ফেস রিকগনিশন স্কিম সহজে তৈরি করা যায়। আমরা চোখ বা ফেসের অন্য অংশের কিছু ইমেজ দিতে পারি, তারপর সেগুলো টেমপ্লেট হিসেবে ব্যবহার করে সহজে ম্যাচ খুঁজে বের করা যায়, কিন্তু চোখের বিভিন্ন ভেরিয়েশন রয়েছে। তাই যদি আমরা অ্যাকিউরেসি লেভেল ৫০% সেট করি, এটি ১০০% অ্যাকিউরেসি লেভেলের চেয়ে ভালো ডিটেক্ট করবে। সাধারণত, বিভিন্ন কেসে অ্যাকিউরেসি লেভেল ৮০%।
টেমপ্লেট ম্যাচ করার ধাপসমূহ
একচুটি ইমেজ নিন এবং সেটাকে গ্রে-স্কেল ইমেজে রূপান্তর করুন।
টেমপ্লেট নিন গ্রে-স্কেল ইমেজ হিসেবে।
টেমপ্লেট একচুটি ইমেজের ওপর স্লাইড করে সেখানে লোকেশন খুঁজে বের করে যেখানে অ্যাকিউরেসি লেভেল ম্যাচ করে।
রেজাল্ট যখন অ্যাকিউরেসি লেভেলের চেয়ে বেশি হয়, সে পজিশনকে ডিটেক্টেড হিসেবে মার্ক করুন।
প্রথম কেসের জন্য ইনপুট ইমেজ এবং টেমপ্লেট:
মেইন ইমেজ

টেমপ্লেট

উদাহরণ কোড
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)
# temp_found থেকে ইনফরমেশন নিয়ে x,y কোঅর্ডিনেট কম্পিউট করুন
(_, 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)
আউটপুট
