রঙ ট্র্যাকিং রঙ সনাক্তকরণের जैसा। ট্র্যাকিংয়ের জন্য কিছু অতিরিক্ত লাইন যোগ করা হয়েছে যাতে সনাক্ত অবজেক্টের এলাকা হিসাব করা যায়, তারপর সেই এলেকার বর্তমান অবস্থান ট্র্যাক করা যায় এবং অবশেষে 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;
}
আউটপুট

