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());
// 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>{
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;