কম্পিউটার টিউটোরিয়াল

OpenCV-এ C++ ব্যবহার করে স্টিল ছবিতে চেহারা সনাক্ত করা

আমরা ছবি থেকে চেহারা সনাক্ত করি। চেহারা সনাক্ত করতে 'detectMultiScale()' ফাংশন ব্যবহার করি।

এই ফাংশনের আসল ফরম্যাট:

সিনট্যাক্স

detectMultiScale(source matrix, vector, searchScaleFactor, minNeighbours, flags, minfeatureSize)

ফাংশন আর্গুমেন্টগুলো পরিবর্তন করে 'detectMultiScale()' ফাংশনকে কন্ট্রোল করা যায়। এই ফাংশন নিম্নলিখিত আর্গুমেন্টগুলো নেয়:

সোর্স ম্যাট্রিক্স

যে ম্যাট্রিক্সে চেহারা সনাক্ত করা হবে। এই কেসে, এটি ভিডিও ফ্রেম ধারণকারী ম্যাট্রিক্স হবে।

ভেক্টর

'detectMultiScale()' ফাংশন একটি রেক্ট্যাঙ্গুলার টাইপের ভেক্টর ফেরত দেয়। রেক্ট্যাঙ্গেল OpenCV-এ একটি ভেক্টর, এবং আমাদের এটিকে ভেক্টর হিসেবে ডিফাইন করতে হয়।

searchScaleFactor

সার্চ স্কেল ফ্যাক্টর নির্ধারণ করে যে ফাংশন কতগুলো ভিন্ন আকারের চেহারা খুঁজবে। সাধারণত 1.1 ব্যবহার করি। দ্রুত সনাক্তকরণের জন্য 1.2 ব্যবহার করা যায়, তবে তখন চেহারা কম সনাক্ত হয়।

minNeighbours

এই প্যারামিটার ডিটেক্টরের আত্মবিশ্বাসের স্তর নির্দেশ করে। বেশি নম্বর ব্যবহার করলে নির্ভরযোগ্য হয় কিন্তু প্রক্রিয়া ধীর হয়। দ্রুত কিন্তু কম নির্ভরযোগ্য সনাক্তকরণের জন্য ছোট নম্বর ব্যবহার করা যায়। সাধারণত ৩ বা ৪ minNeighbours হিসেবে ব্যবহার করি।

ফ্ল্যাগস

ডিফল্টভাবে ফাংশন সব চেহারা খুঁজে বের করে। 'CASCADE_FIND_BIGGEST_OBJECT' ফ্ল্যাগ ব্যবহার করলে শুধু সবচেয়ে বড় চেহারা খুঁজে বের করে। 'CASCADE_SCALE_IMAGE' ব্যবহার করলে একাধিক চেহারা খুঁজে বের করা যায়।

minFeatureSize

minFeatureSize চেহারার ন্যূনতম আকার নির্ধারণ করে। দূরে থাকা চেহারা সনাক্ত করতে ছোট মান, কাছে থাকা চেহারার জন্য বড় মান ব্যবহার করি। সাধারণ দূরত্বের জন্য (20x20) বা (30x30) আকার ব্যবহার করি। উদাহরণে আমরা detectMultiScale() ফাংশনটি নিচের মতো ব্যবহার করেছি:

faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));

OpenCV-এ স্টিল ছবি থেকে মানুষের চেহারা সনাক্ত করার কোড

#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; // মানুষের চেহারা সহ ছবি লোড করার জন্য ম্যাট্রিক্স
    image_with_humanface = imread("friends.jpg"); // মানুষের চেহারা সহ ছবি লোড
    namedWindow("Face Detection"); // ফলাফল দেখানোর জন্য উইন্ডো
    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++) { // চেহারার চারদিকে রেক্ট্যাঙ্গেল আঁকার জন্য লুপ
        Mat faceROI = image_with_humanface(faces[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("Face Detection", image_with_humanface); // সনাক্ত চেহারা দেখানো
    waitKey(0); // প্রোগ্রাম টার্মিনেট করার জন্য কীস্ট্রোক অপেক্ষা
    return 0;
}

আউটপুট

OpenCV-এ C++ ব্যবহার করে স্টিল ছবিতে চেহারা সনাক্ত করা

  1. OpenCV-এ C++ ব্যবহার করে নির্দিষ্ট পিক্সেলের মান পাওয়ার পদ্ধতি

  2. OpenCV-এ C++ ব্যবহার করে উপবৃত্ত আঁকা

  3. OpenCV-এ C++ ব্যবহার করে রেখা আঁকা

  4. OpenCV-এ C++ ব্যবহার করে ইমেজের চ্যানেল সংখ্যা গণনা করা