আমরা জানব কিভাবে OpenCV-এ সনাক্ত চেহারা ক্রপ করা যায়। সনাক্ত চেহারা ক্রপ করতে একাধিক ম্যাট্রিক্স দরকার। সবচেয়ে উপযুক্ত পদ্ধতি হলো ইমেজ অ্যারে ব্যবহার করা। এই প্রোগ্রামে নিচের দুটি লাইন ব্যবহার করে দুটি ইমেজ ম্যাট্রিক্স ঘোষণা করা হয়েছে:
- Mat cropped_faces[4];
- Mat faceROI[4];
প্রথম ম্যাট্রিক্সটি ক্রপ করা ছবিগুলো সংরক্ষণ করার জন্য, এবং দ্বিতীয় ম্যাট্রিক্সটি রিজন অফ ইন্টারেস্ট (ROI) নির্ধারণের জন্য। সনাক্তকরণ প্রক্রিয়ায়, প্রথমে প্রোগ্রাম চেহারাগুলো লোকেট করে এবং ভেক্টরে সংরক্ষণ করে। আমাদের প্রোগ্রামে ভেক্টরের নাম 'faces'। ভেক্টর একাধিক এলিমেন্ট ধারণ করতে পারে।
নিচের দুটি লাইন ব্যবহার করে আমরা ভেক্টরগুলো চিহ্নিত করি, ছবিতে তাদের অবস্থান লোকেট করি এবং অবশেষে চেহারার অঞ্চলটি 'faceROI[i]' ম্যাট্রিক্সে ক্রপ করি।
- faceROI[i] = image_with_humanface(faces[i]);
- cropped_faces[i] = faceROI[i];
প্রথম লাইনটি 'image_with_humanface' নামে ছবিতে faces[i] ভেক্টরকে লোকেট করে, ক্রপ করে এবং 'faceROI[i]' ম্যাট্রিক্সে সংরক্ষণ করে। দ্বিতীয় লাইনটি ক্রপ করা ছবিগুলোকে অন্য একটি ম্যাট্রিক্স অ্যারেতে পাস করে। এই ম্যাট্রিক্স অ্যারেটি ক্রপ করা ছবিগুলো দেখানোর জন্য ব্যবহার করা হয়েছে।
সনাক্ত চেহারা ক্রপ করে আলাদা উইন্ডোতে দেখানোর প্রোগ্রাম
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp> // 'rectangle()' ফাংশনের সংজ্ঞা এই হেডারে
#include<opencv2/objdetect/objdetect.hpp> // ক্যাসকেড ক্লাসিফায়ারের সংজ্ঞা এই হেডারে
#include<string>
using namespace std;
using namespace cv;
int main(int argc, char** argv) {
Mat image_with_humanface; // মানুষের চেহারা সহ ছবি লোড করার জন্য ম্যাট্রিক্স
Mat cropped_faces[3]; // ক্রপ করা চেহারা দেখানোর জন্য ৪ এলিমেন্টের ম্যাট্রিক্স অ্যারে
Mat faceROI[3]; // ক্রপ করা চেহারা ধারণ করার জন্য ৪ এলিমেন্টের ম্যাট্রিক্স অ্যারে
image_with_humanface = imread("friends3.jpg"); // মানুষের চেহারা সহ ছবি লোড
namedWindow("Face1"); // ১ম ক্রপ করা চেহারা দেখানোর জন্য উইন্ডো
namedWindow("Face2"); // ২য় ক্রপ করা চেহারা দেখানোর জন্য উইন্ডো
namedWindow("Face3"); // ৩য় ক্রপ করা চেহারা দেখানোর জন্য উইন্ডো
string trained_classifier_location = "C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml"; // XML ট্রেন্ড ক্লাসিফায়ারের লোকেশন
CascadeClassifier faceDetector; // CascadeClassifier ক্লাসের 'face detector' অবজেক্ট
faceDetector.load(trained_classifier_location); // XML ট্রেন্ড ক্লাসিফায়ার অবজেক্টে লোড
vector<Rect> faces; // চেহারার জন্য রেক্ট্যাঙ্গুলার ভেক্টর
vector<Rect> boundary; // রেক্ট্যাঙ্গেলের জন্য রেক্ট্যাঙ্গুলার ভেক্টর
faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20)); // 'image_with_humanface' ম্যাট্রিক্সে চেহারা সনাক্তকরণ
for (size_t i = 0; i < faces.size(); i++) { // চেহারার চারদিকে রেক্ট্যাঙ্গেল আঁকার জন্য লুপ
faceROI[i] = image_with_humanface(faces[i]);
cropped_faces[i] = faceROI[i];
int x = faces[i].x; // রেক্ট্যাঙ্গেলের শুরুর সারি মান
int y = faces[i].y; // রেক্ট্যাঙ্গেলের শুরুর কলাম মান
int h = y + faces[i].height; // রেক্ট্যাঙ্গেলের উচ্চতা হিসাব
int w = x + faces[i].width; // রেক্ট্যাঙ্গেলের প্রস্থ হিসাব
rectangle(image_with_humanface, Point(x, y), Point(w, h), Scalar(255, 0, 255), 2, 8, 0); // চেহারার চারদিকে রেক্ট্যাঙ্গেল আঁকা
}
imshow("Face1", cropped_faces[0]); // ১ম ক্রপ করা চেহারা দেখানো
imshow("Face2", cropped_faces[1]); // ২য় ক্রপ করা চেহারা দেখানো
imshow("Face3", cropped_faces[2]); // ৩য় ক্রপ করা চেহারা দেখানো
waitKey(0); // প্রোগ্রাম টার্মিনেট করার জন্য কীস্ট্রোক অপেক্ষা
return 0;
}
আউটপুট
