در ابتدا بایستی رنگ قرمز را فیلتر کنید که اینکار قبلا در پست 1 و پست 2 توضیح داده شده تنها نکته ای که وجود داره hue قرمز در ابتدا و انتهای بازه وجود داره اگر دایره ای تصویر کنید بهم پیوسته هستند در بازه 0 تا 50 و بازه 150 تا 180 برای رنگ قرمز می باشد.
پس از بدست آوردن ماسک باید به دنبال کانتور بزرگ باشید که باید findContour مجموعه کانتور ها را بدست آورده و با contourArea مساحت هر یک از کانتور ها را.
در نهایت باید مرکز ثقل بلاب ماکزیمم را بدست آورید بوسیله مومنت که قبلا در این پست توضیح داده شده .
int findMaxBlob(InputArray _src,vector<vector<Point>> &contours){
Mat src = _src.getMat().clone();
findContours(src, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
int max_index = -1;
int max_area = 0;
for (size_t i = 0; i < contours.size(); i++){
int cur_area = contourArea(contours[i]);
if (cur_area > max_area){
max_area = cur_area;
max_index = i;
}
}
return max_index;
}
int _tmain(int argc, _TCHAR* argv[])
{
Mat img1 = imread("d:\\a.jpg", 1);
Mat hsv_i;
cvtColor(img1, hsv_i, CV_BGR2HSV);
Mat mask_img1, mask_img2, mask_img;
inRange(hsv_i, Scalar(150, 180, 20), Scalar(180, 255, 255), mask_img1);
inRange(hsv_i, Scalar(0, 180, 20), Scalar(50, 255, 255), mask_img2);
mask_img = mask_img1 | mask_img2;
vector<vector<Point>> contours;
int max_index = findMaxBlob(mask_img, contours);
Moments m = moments(mask_img, false);
Point center(m.m10 / m.m00, m.m01 / m.m00);
Rect br = boundingRect(contours[max_index]);
rectangle(img1, br, CV_RGB(0, 255, 0), 1);
circle(img1, center, 3, CV_RGB(255, 0, 0), -1);
imshow("dd", img1);
imwrite("d:\\img.png", mask_img);
waitKey(0);
return 0;
}