11
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user