From 87a2722aa0317f6b2ce38c8c2c73b92986c28cb8 Mon Sep 17 00:00:00 2001 From: LLida <3199335945@qq.com> Date: Fri, 5 Dec 2025 18:30:32 +0800 Subject: [PATCH] 11 --- src/MindVisionMain.cpp | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/MindVisionMain.cpp b/src/MindVisionMain.cpp index 8492b99..432652f 100644 --- a/src/MindVisionMain.cpp +++ b/src/MindVisionMain.cpp @@ -301,7 +301,8 @@ int main(int /*argc*/, char* /*argv*/[]) { predicted_center = std::make_unique(kalman_tracker.predict()); // Start tracking if successfully detected - if (!is_tracking && !armor_plates.empty()) { + if (!is_tracking && !armor_plates.empty() && armor_plates[0].corners_2d.size() >= 4) { + // Only start tracking if we have all 4 corners cv::Rect2d armor_rect = cv::boundingRect(std::vector{ armor_plates[0].corners_2d[0], armor_plates[0].corners_2d[1], @@ -318,11 +319,14 @@ int main(int /*argc*/, char* /*argv*/[]) { // Ensure the rectangle is within frame bounds expanded_rect = expanded_rect & cv::Rect2d(0, 0, frame.cols, frame.rows); - tracker = cv::TrackerKCF::create(); // Create new tracker instance - tracker->init(frame, expanded_rect); - tracking_roi = expanded_rect; - is_tracking = true; - tracking_frame_count = 0; + // Initialize tracker only if the rectangle has positive area + if (expanded_rect.area() > 0) { + tracker = cv::TrackerKCF::create(); // Create new tracker instance + tracker->init(frame, expanded_rect); + tracking_roi = expanded_rect; + is_tracking = true; + tracking_frame_count = 0; + } } consecutive_predicts = 0; @@ -356,15 +360,19 @@ int main(int /*argc*/, char* /*argv*/[]) { bool is_predicted = (display_center != nullptr) && (detection_center == nullptr && (!is_tracking || tracking_center == nullptr)); // Calculate ballistic prediction point - cv::Point2f* ballistic_point = ballistic_predictor.predict_ballistic_point( - predicted_center.get(), img_center, target_speed - ); + cv::Point2f* ballistic_point = nullptr; + if (predicted_center) { + ballistic_point = ballistic_predictor.predict_ballistic_point( + predicted_center.get(), img_center, target_speed + ); + } auto current_time = std::chrono::high_resolution_clock::now(); // Visualization visualizer.draw_light_bars(frame, valid_light_bars, target_color); if (!armor_plates.empty()) { + // Only draw armor plate if it has valid data visualizer.draw_armor_plate(frame, armor_plates[0]); } // Draw tracking rectangle if tracking @@ -372,11 +380,16 @@ int main(int /*argc*/, char* /*argv*/[]) { cv::rectangle(frame, tracking_roi, cv::Scalar(0, 255, 0), 2); } visualizer.draw_offset_text(frame, display_center, target_color, is_predicted); - visualizer.draw_ballistic_point(frame, ballistic_point); + if (ballistic_point != nullptr) { + visualizer.draw_ballistic_point(frame, ballistic_point); + } // Output control data to TTL (passing use_ttl to control whether to send) // Now sending on every frame for smoother control - output_control_data(display_center, target_color, ttl, img_center, use_ttl); + // Only send if ballistic_point is not null and we have a valid display center + if (display_center != nullptr && ballistic_point != nullptr) { + output_control_data(display_center, target_color, ttl, img_center, use_ttl); + } // Create trackbars for PID parameter tuning static bool initialized_trackbars = false;