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

OpenCV-এ C++ ব্যবহার করে রঙ ট্র্যাক করা

রঙ ট্র্যাকিং রঙ সনাক্তকরণের जैसा। ট্র্যাকিংয়ের জন্য কিছু অতিরিক্ত লাইন যোগ করা হয়েছে যাতে সনাক্ত অবজেক্টের এলাকা হিসাব করা যায়, তারপর সেই এলেকার বর্তমান অবস্থান ট্র্যাক করা যায় এবং অবশেষে OpenCV-এর line() ফাংশন ব্যবহার করে অবজেক্টের গতিপথ দেখানো হয়।

OpenCV-এ C++ ব্যবহার করে রঙ ট্র্যাক করার প্রোগ্রাম

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;

int main(int argc, char** argv) {
    VideoCapture video_load(0); // ডিফল্ট ক্যামেরা থেকে ভিডিও ক্যাপচার
    namedWindow("Adjust"); // ইমেজ দেখানোর জন্য উইন্ডো
    int Hue_Low = 0; // Hue-এর নিম্ন সীমা
    int Hue_high = 22; // Hue-এর উপরের সীমা
    int Sat_Low = 99; // Saturation-এর নিম্ন সীমা
    int Sat_high = 255; // Saturation-এর উপরের সীমা
    int Val_Low = 0; // Value-এর নিম্ন সীমা
    int Val_high = 255; // Value-এর উপরের সীমা
    createTrackbar("LowH", "Adjust", &Hue_Low, 179); // Hue নিম্ন সীমার জন্য ট্র্যাকবার
    createTrackbar("HighH", "Adjust", &Hue_high, 179); // Hue উপরের সীমার জন্য ট্র্যাকবার
    createTrackbar("LowS", "Adjust", &Sat_Low, 255); // Saturation নিম্ন সীমার জন্য ট্র্যাকবার
    createTrackbar("HighS", "Adjust", &Sat_high, 255); // Saturation উপরের সীমার জন্য ট্র্যাকবার
    createTrackbar("LowV", "Adjust", &Val_Low, 255); // Value নিম্ন সীমার জন্য ট্র্যাকবার
    createTrackbar("HighV", "Adjust", &Val_high, 255); // Value উপরের সীমার জন্য ট্র্যাকবার
    int Horizontal_Last = -1; // প্রাথমিক আড়াঘাত অবস্থান
    int vertical_Last = -1; // প্রাথমিক লম্বাঘাত অবস্থান
    Mat temp; // ভিডিও স্ট্রিম থেকে ফ্রেম লোড করার জন্য ম্যাট্রিক্স
    video_load.read(temp); // ভিডিও স্ট্রিম থেকে ফ্রেম লোড
    Mat track_motion = Mat::zeros(temp.size(), CV_8UC3); // সনাক্তকরণের জন্য কালো ম্যাট্রিক্স
    while (true) {
        Mat actual_Image; // আসল ইমেজের জন্য ম্যাট্রিক্স
        bool temp_load = video_load.read(actual_Image); // ভিডিও থেকে ফ্রেম লোড
        Mat converted_to_HSV; // রূপান্তরিত ইমেজ সংরক্ষণের জন্য ম্যাট্রিক্স
        cvtColor(actual_Image, converted_to_HSV, COLOR_BGR2HSV); // BGR ইমেজ HSV-এ রূপান্তর
        Mat adjusted_frame; // সনাক্ত রঙের জন্য ম্যাট্রিক্স
        inRange(converted_to_HSV, Scalar(Hue_Low, Sat_Low, Val_Low), Scalar(Hue_high, Sat_high, Val_high), adjusted_frame); // ট্র্যাকবার মান প্রয়োগ
        erode(adjusted_frame, adjusted_frame, getStructuringElement(MORPH_ELLIPSE, Size(5, 5))); // মর্ফোলজিক্যাল ওপেনিং - ফোরগ্রাউন্ড থেকে ছোট অবজেক্ট সরানো
        dilate(adjusted_frame, adjusted_frame, getStructuringElement(MORPH_ELLIPSE, Size(5, 5))); // মর্ফোলজিক্যাল ওপেনিং - ফোরগ্রাউন্ড থেকে ছোট অবজেক্ট সরানো
        dilate(adjusted_frame, adjusted_frame, getStructuringElement(MORPH_ELLIPSE, Size(5, 5))); // মর্ফোলজিক্যাল ক্লোজিং - ফোরগ্রাউন্ডে ছোট ছিদ্র পূরণ
        erode(adjusted_frame, adjusted_frame, getStructuringElement(MORPH_ELLIPSE, Size(5, 5))); // মর্ফোলজিক্যাল ক্লোজিং - ফোরগ্রাউন্ডে ছোট ছিদ্র পূরণ
        Moments detecting_object = moments(adjusted_frame); // সনাক্ত রঙের ফ্রেম থেকে অবজেক্ট তৈরি
        double vertical_moment = detecting_object.m01; // লম্বাঘাত অবস্থানের মান
        double horizontal_moment = detecting_object.m10; // আড়াঘাত অবস্থানের মান
        double tracking_area = detecting_object.m00; // অবজেক্টের এলাকা
        if (tracking_area > 10000) { // অবজেক্টের এলাকা ১০০০০ পিক্সেলের বেশি হলে
            int posX = horizontal_moment / tracking_area; // অবজেক্টের আড়াঘাত অবস্থান হিসাব
            int posY = vertical_moment / tracking_area; // অবজেক্টের লম্বাঘাত অবস্থান হিসাব
            if (Horizontal_Last >= 0 && vertical_Last >= 0 && posX >= 0 && posY >= 0) { // সনাক্ত অবজেক্ট হলে
                line(track_motion, Point(posX, posY), Point(Horizontal_Last, vertical_Last), Scalar(0, 0, 255), 2); // সনাক্ত অবজেক্টের গতিপথে লাল রঙের লাইন আঁকা
            }
            Horizontal_Last = posX; // নতুন আড়াঘাত অবস্থান
            vertical_Last = posY; // নতুন লম্বাঘাত অবস্থান
        }
        imshow("Detected_Object", adjusted_frame); // সনাক্ত অবজেক্ট দেখানো
        actual_Image = actual_Image + track_motion; // আসল ভিডিও ফ্রেমে ক্রমাগত লাইন আঁকা
        imshow("Actual", actual_Image); // আসল ভিডিও দেখানো
        cout << "position of the object is: " << Horizontal_Last << "," << vertical_Last << endl; // ট্র্যাক করা কো-অর্ডিনেট দেখানো
        if (waitKey(30) == 27) { // ESC চাপলে লুপ ব্রেক
            cout << "esc key is pressed by user" << endl;
            break;
        }
    }
    return 0;
}

আউটপুট

OpenCV-এ C++ ব্যবহার করে রঙ ট্র্যাক করা

OpenCV-এ C++ ব্যবহার করে রঙ ট্র্যাক করা

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

  2. OpenCV-এ C++ ব্যবহার করে সিঙ্গেল চ্যানেল ইমেজের পিক্সেল মান পড়া

  3. OpenCV-এ C++ ব্যবহার করে কালার স্পেস কনভার্ট করা

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