This commit is contained in:
2025-12-05 18:30:32 +08:00
parent 3f7cc22f95
commit 87a2722aa0

View File

@@ -301,7 +301,8 @@ int main(int /*argc*/, char* /*argv*/[]) {
predicted_center = std::make_unique<cv::Point2f>(kalman_tracker.predict()); predicted_center = std::make_unique<cv::Point2f>(kalman_tracker.predict());
// Start tracking if successfully detected // 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<cv::Point2f>{ cv::Rect2d armor_rect = cv::boundingRect(std::vector<cv::Point2f>{
armor_plates[0].corners_2d[0], armor_plates[0].corners_2d[0],
armor_plates[0].corners_2d[1], armor_plates[0].corners_2d[1],
@@ -318,11 +319,14 @@ int main(int /*argc*/, char* /*argv*/[]) {
// Ensure the rectangle is within frame bounds // Ensure the rectangle is within frame bounds
expanded_rect = expanded_rect & cv::Rect2d(0, 0, frame.cols, frame.rows); expanded_rect = expanded_rect & cv::Rect2d(0, 0, frame.cols, frame.rows);
tracker = cv::TrackerKCF::create(); // Create new tracker instance // Initialize tracker only if the rectangle has positive area
tracker->init(frame, expanded_rect); if (expanded_rect.area() > 0) {
tracking_roi = expanded_rect; tracker = cv::TrackerKCF::create(); // Create new tracker instance
is_tracking = true; tracker->init(frame, expanded_rect);
tracking_frame_count = 0; tracking_roi = expanded_rect;
is_tracking = true;
tracking_frame_count = 0;
}
} }
consecutive_predicts = 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)); bool is_predicted = (display_center != nullptr) && (detection_center == nullptr && (!is_tracking || tracking_center == nullptr));
// Calculate ballistic prediction point // Calculate ballistic prediction point
cv::Point2f* ballistic_point = ballistic_predictor.predict_ballistic_point( cv::Point2f* ballistic_point = nullptr;
predicted_center.get(), img_center, target_speed 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(); auto current_time = std::chrono::high_resolution_clock::now();
// Visualization // Visualization
visualizer.draw_light_bars(frame, valid_light_bars, target_color); visualizer.draw_light_bars(frame, valid_light_bars, target_color);
if (!armor_plates.empty()) { if (!armor_plates.empty()) {
// Only draw armor plate if it has valid data
visualizer.draw_armor_plate(frame, armor_plates[0]); visualizer.draw_armor_plate(frame, armor_plates[0]);
} }
// Draw tracking rectangle if tracking // 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); cv::rectangle(frame, tracking_roi, cv::Scalar(0, 255, 0), 2);
} }
visualizer.draw_offset_text(frame, display_center, target_color, is_predicted); 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) // Output control data to TTL (passing use_ttl to control whether to send)
// Now sending on every frame for smoother control // 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 // Create trackbars for PID parameter tuning
static bool initialized_trackbars = false; static bool initialized_trackbars = false;