visualization is better now

This commit is contained in:
黄JY
2026-04-10 14:59:19 +08:00
parent 42cbd5c96f
commit 62d2ce8cc6
3 changed files with 39 additions and 2 deletions
@@ -54,6 +54,8 @@ struct TargetObservationDebugInfo {
float mot_ms = 0.0f; float mot_ms = 0.0f;
float depth_ms = 0.0f; float depth_ms = 0.0f;
float total_ms = 0.0f; float total_ms = 0.0f;
std::vector<yolos::pose::PoseResult> poses;
std::vector<cv::Point> valid_projected_pixels;
}; };
class TargetObservationProcessor { class TargetObservationProcessor {
@@ -71,6 +73,10 @@ public:
bool initialized() const { return initialized_; } bool initialized() const { return initialized_; }
void draw_detected_poses(
cv::Mat& image_bgr,
const std::vector<yolos::pose::PoseResult>& poses) const;
private: private:
Eigen::MatrixXf format_detections( Eigen::MatrixXf format_detections(
const std::vector<yolos::pose::PoseResult>& poses) const; const std::vector<yolos::pose::PoseResult>& poses) const;
+13 -1
View File
@@ -209,7 +209,7 @@ void CloudReprojectionRosNode::loadParameters()
this->declare_parameter<int>("register_keys.debug", 1); this->declare_parameter<int>("register_keys.debug", 1);
this->declare_parameter<std::string>("register_keys.target_yolo_engine", default_yolo_engine); this->declare_parameter<std::string>("register_keys.target_yolo_engine", default_yolo_engine);
this->declare_parameter<std::string>("register_keys.target_yolo_labels", default_yolo_labels); this->declare_parameter<std::string>("register_keys.target_yolo_labels", default_yolo_labels);
this->declare_parameter<double>("register_keys.target_yolo_conf", 0.45); this->declare_parameter<double>("register_keys.target_yolo_conf", 0.5);
this->declare_parameter<double>("register_keys.target_yolo_nms", 0.50); this->declare_parameter<double>("register_keys.target_yolo_nms", 0.50);
this->declare_parameter<double>("register_keys.target_min_depth", 0.5); this->declare_parameter<double>("register_keys.target_min_depth", 0.5);
this->declare_parameter<double>("register_keys.target_max_depth", 12.0); this->declare_parameter<double>("register_keys.target_max_depth", 12.0);
@@ -621,6 +621,18 @@ void CloudReprojectionRosNode::syncCallback(
cv::Mat overlay_vis = odin_ros_driver::overlay_projected_cloud_on_image( cv::Mat overlay_vis = odin_ros_driver::overlay_projected_cloud_on_image(
cam_bgr, cloud_cam, reprojector_->getCameraParams()); cam_bgr, cloud_cam, reprojector_->getCameraParams());
#ifdef ODIN_ROS_DRIVER_HAS_TARGET_OBSERVATION #ifdef ODIN_ROS_DRIVER_HAS_TARGET_OBSERVATION
if (debug_target_observation_ && target_observation_processor_) {
target_observation_processor_->draw_detected_poses(
overlay_vis,
target_debug.poses);
for (const auto& pixel : target_debug.valid_projected_pixels) {
if (pixel.x < 0 || pixel.x >= overlay_vis.cols ||
pixel.y < 0 || pixel.y >= overlay_vis.rows) {
continue;
}
cv::circle(overlay_vis, pixel, 3, cv::Scalar(0, 255, 0), -1);
}
}
if (target_observation.valid && debug_target_observation_) { if (target_observation.valid && debug_target_observation_) {
odin_ros_driver::draw_target_observation_overlay( odin_ros_driver::draw_target_observation_overlay(
overlay_vis, overlay_vis,
+20 -1
View File
@@ -87,6 +87,7 @@ TargetObservation TargetObservationProcessor::process(
const auto yolo_end = std::chrono::steady_clock::now(); const auto yolo_end = std::chrono::steady_clock::now();
if (debug_info) { if (debug_info) {
debug_info->poses_count = static_cast<int>(poses.size()); debug_info->poses_count = static_cast<int>(poses.size());
debug_info->poses = poses;
debug_info->yolo_ms = debug_info->yolo_ms =
std::chrono::duration<float, std::milli>(yolo_end - yolo_start).count(); std::chrono::duration<float, std::milli>(yolo_end - yolo_start).count();
} }
@@ -143,6 +144,16 @@ TargetObservation TargetObservationProcessor::process(
return target; return target;
} }
void TargetObservationProcessor::draw_detected_poses(
cv::Mat& image_bgr,
const std::vector<yolos::pose::PoseResult>& poses) const
{
if (!initialized_ || image_bgr.empty() || poses.empty()) {
return;
}
yolo_->drawPoses(image_bgr, poses);
}
Eigen::MatrixXf TargetObservationProcessor::format_detections( Eigen::MatrixXf TargetObservationProcessor::format_detections(
const std::vector<yolos::pose::PoseResult>& poses) const const std::vector<yolos::pose::PoseResult>& poses) const
{ {
@@ -290,6 +301,8 @@ TargetObservation TargetObservationProcessor::enrich_target_with_cloud(
std::vector<float> per_keypoint_depths; std::vector<float> per_keypoint_depths;
per_keypoint_depths.reserve(kHipKeypointIndices.size()); per_keypoint_depths.reserve(kHipKeypointIndices.size());
std::vector<cv::Point> valid_projected_pixels;
valid_projected_pixels.reserve(128);
for (const int kp_index : kHipKeypointIndices) { for (const int kp_index : kHipKeypointIndices) {
if (kp_index >= static_cast<int>(pose.keypoints.size())) { if (kp_index >= static_cast<int>(pose.keypoints.size())) {
@@ -307,6 +320,11 @@ TargetObservation TargetObservationProcessor::enrich_target_with_cloud(
const float dv = uv_points[i].y - kp.y; const float dv = uv_points[i].y - kp.y;
if (std::hypot(du, dv) < config_.search_radius_px) { if (std::hypot(du, dv) < config_.search_radius_px) {
nearby_depths.push_back(cam_points[i].z()); nearby_depths.push_back(cam_points[i].z());
if (debug_info) {
valid_projected_pixels.emplace_back(
static_cast<int>(std::lround(uv_points[i].x)),
static_cast<int>(std::lround(uv_points[i].y)));
}
} }
} }
if (nearby_depths.size() < 3) { if (nearby_depths.size() < 3) {
@@ -316,6 +334,7 @@ TargetObservation TargetObservationProcessor::enrich_target_with_cloud(
} }
if (debug_info) { if (debug_info) {
debug_info->depth_sample_count = static_cast<int>(per_keypoint_depths.size()); debug_info->depth_sample_count = static_cast<int>(per_keypoint_depths.size());
debug_info->valid_projected_pixels = std::move(valid_projected_pixels);
} }
if (per_keypoint_depths.empty()) { if (per_keypoint_depths.empty()) {
@@ -422,7 +441,7 @@ void draw_target_observation_overlay(
} }
const int u = static_cast<int>(std::lround(observation.keypoints_xyc[i * 3 + 0])); const int u = static_cast<int>(std::lround(observation.keypoints_xyc[i * 3 + 0]));
const int v = static_cast<int>(std::lround(observation.keypoints_xyc[i * 3 + 1])); const int v = static_cast<int>(std::lround(observation.keypoints_xyc[i * 3 + 1]));
cv::circle(image_bgr, cv::Point(u, v), 4, cv::Scalar(0, 255, 0), -1); cv::circle(image_bgr, cv::Point(u, v), 3, cv::Scalar(0, 255, 0), -1);
} }
const std::string label = format_target_text(observation); const std::string label = format_target_text(observation);