5 #include <sam_onnx_ros/segmentation.hpp>
6 #include <sensor_msgs/Image.h>
7 #include <sensor_msgs/PointCloud2.h>
8 #include <yolo_onnx_ros/detection.hpp>
20 std::tie(yoloDetector, params) = Initialize(yolo_model);
24 SEG::DL_INIT_PARAM params_encoder;
25 SEG::DL_INIT_PARAM params_decoder;
30 std::tie(samSegmentors, params_encoder, params_decoder, res, resSam) = Initialize(sam_encoder, sam_decoder);
34 resYolo = Detector(yoloDetector, img);
37 for (
const auto& result : resYolo)
39 res.boxes.push_back(result.box);
42 ROS_DEBUG(
"Confidence: %f", result.confidence);
43 ROS_DEBUG(
"Class: %s", yoloDetector->classes[result.classId].c_str());
44 ROS_DEBUG(
"Class ID: %d", result.classId);
47 SegmentAnything(samSegmentors, params_encoder, params_decoder, img, resSam, res);
49 seg_result.
masks = std::move(res.masks);
50 seg_result.
boxes = std::move(res.boxes);
59 ROS_WARN(
"SAM produced %zu masks for %zu YOLO boxes — alignment broken, discarding labels this frame",
73 cv::Scalar(0, 0, 255),
74 cv::Scalar(0, 255, 0),
75 cv::Scalar(255, 0, 0),
76 cv::Scalar(0, 255, 255),
77 cv::Scalar(255, 0, 255),
78 cv::Scalar(255, 255, 0),
79 cv::Scalar(128, 0, 128),
80 cv::Scalar(0, 128, 128)
84 cv::Mat overlay = rgb.clone();
86 for (
size_t i = 0; i < masks.
size(); i++)
89 cv::Mat working_mask = masks[i].clone();
92 if (working_mask.rows != rgb.rows || working_mask.cols != rgb.cols)
93 cv::resize(working_mask, working_mask, rgb.size(), 0, 0, cv::INTER_NEAREST);
96 if (cv::countNonZero((working_mask > 0) & (working_mask < 255)) > 0)
97 cv::threshold(working_mask, working_mask, 127, 255, cv::THRESH_BINARY);
100 cv::Scalar color = colors[i % colors.
size()];
103 cv::Mat colorMask = cv::Mat::zeros(rgb.size(), CV_8UC3);
104 colorMask.setTo(color, working_mask);
107 cv::addWeighted(overlay, 1.0, colorMask, 0.2, 0, overlay);
111 cv::findContours(working_mask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
114 cv::drawContours(rgb, contours, -1, cv::Scalar(0, 0, 0), 2);
115 cv::drawContours(rgb, contours, -1, color, 1);
119 cv::addWeighted(rgb, 0.7, overlay, 0.3, 0, rgb);