#include #include int main() { cv::VideoCapture cap(0); if (!cap.isOpened()) { std::cout << "Не удалось открыть камеру\n"; return -1; } cv::Mat frame, hsv, mask1, mask2, mask; while (true) { cap >> frame; if (frame.empty()) break; cv::cvtColor(frame, hsv, cv::COLOR_BGR2HSV); cv::Scalar lower_red1(0, 120, 70); cv::Scalar upper_red1(10, 255, 255); cv::Scalar lower_red2(170, 120, 70); cv::Scalar upper_red2(180, 255, 255); cv::inRange(hsv, lower_red1, upper_red1, mask1); cv::inRange(hsv, lower_red2, upper_red2, mask2); cv::bitwise_or(mask1, mask2, mask); cv::GaussianBlur(mask, mask, cv::Size(7,7), 0); std::vector> contours; cv::findContours(mask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); for (const auto &c : contours) { if (cv::contourArea(c) > 1000) { cv::Rect r = cv::boundingRect(c); cv::rectangle(frame, r, cv::Scalar(0, 255, 0), 2); cv::Moments m = cv::moments(c); if (m.m00 > 0) { int cx = m.m10 / m.m00; int cy = m.m01 / m.m00; cv::circle(frame, cv::Point(cx, cy), 8, cv::Scalar(0, 0, 255), -1); } } } cv::imshow("Red Tracking", frame); cv::imshow("Mask", mask); if (cv::waitKey(1) == 27) break; } cap.release(); cv::destroyAllWindows(); return 0; }