3 #include <cv_bridge/cv_bridge.h>
5 #include <pcl/point_cloud.h>
6 #include <pcl/point_types.h>
7 #include <pcl_conversions/pcl_conversions.h>
8 #include <sam_onnx_ros/segmentation.hpp>
9 #include <sensor_msgs/Image.h>
10 #include <sensor_msgs/PointCloud2.h>
11 #include <yolo_onnx_ros/detection.hpp>
21 std::tie(yoloDetector, params) = Initialize(yolo_model);
25 SEG::DL_INIT_PARAM params_encoder;
26 SEG::DL_INIT_PARAM params_decoder;
31 std::tie(samSegmentors, params_encoder, params_decoder, res, resSam) = Initialize(sam_encoder, sam_decoder);
35 resYolo = Detector(yoloDetector, img);
38 for (
const auto& result : resYolo)
47 res.boxes.push_back(result.box);
48 ROS_DEBUG_STREAM(
"Confidence is OKOK: " << result.confidence);
49 ROS_DEBUG_STREAM(
"Class is: " << yoloDetector->classes[result.classId]);
50 ROS_DEBUG_STREAM(
"Class ID is: " << result.classId);
53 SegmentAnything(samSegmentors, params_encoder, params_decoder, img, resSam, res);
55 return std::move(res.masks);
63 cv::Scalar(0, 0, 255),
64 cv::Scalar(0, 255, 0),
65 cv::Scalar(255, 0, 0),
66 cv::Scalar(0, 255, 255),
67 cv::Scalar(255, 0, 255),
68 cv::Scalar(255, 255, 0),
69 cv::Scalar(128, 0, 128),
70 cv::Scalar(0, 128, 128)
74 cv::Mat overlay = rgb.clone();
76 for (
size_t i = 0; i < masks.
size(); i++)
79 cv::Mat working_mask = masks[i].clone();
82 if (working_mask.rows != rgb.rows || working_mask.cols != rgb.cols)
83 cv::resize(working_mask, working_mask, rgb.size(), 0, 0, cv::INTER_NEAREST);
86 if (cv::countNonZero((working_mask > 0) & (working_mask < 255)) > 0)
87 cv::threshold(working_mask, working_mask, 127, 255, cv::THRESH_BINARY);
90 cv::Scalar color = colors[i % colors.
size()];
93 cv::Mat colorMask = cv::Mat::zeros(rgb.size(), CV_8UC3);
94 colorMask.setTo(color, working_mask);
97 cv::addWeighted(overlay, 1.0, colorMask, 0.2, 0, overlay);
101 cv::findContours(working_mask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
104 cv::drawContours(rgb, contours, -1, cv::Scalar(0, 0, 0), 2);
105 cv::drawContours(rgb, contours, -1, color, 1);
109 cv::addWeighted(rgb, 0.7, overlay, 0.3, 0, rgb);
117 cv::Mat visualization = rgb.clone();
121 cv::imwrite((temp_dir /
"visualization.png").
string(), visualization);
125 double min_val, max_val;
126 cv::minMaxLoc(filtered_depth_image, &min_val, &max_val);
131 depth_vis = cv::Mat::zeros(filtered_depth_image.size(), CV_8UC1);
136 filtered_depth_image.convertTo(depth_vis, CV_8UC1, 255.0 / max_val);
140 cv::applyColorMap(depth_vis, depth_color, cv::COLORMAP_JET);
141 cv::imwrite((temp_dir /
"visualization_depth_color.png").
string(), depth_color);
145 cv::imwrite((temp_dir /
"visualization_depth.png").
string(), depth_vis);
148 cv::imwrite((temp_dir /
"visualization_with_masks.png").
string(), visualization);
151 sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(),
"bgr8", visualization).toImageMsg();
152 msg->header.stamp = ros::Time::now();
154 typedef pcl::PointCloud<pcl::PointXYZRGB> PointCloud;
155 PointCloud::Ptr combined_cloud (
new PointCloud);
157 combined_cloud->header.frame_id =
"map";
166 pcl::PointXYZRGB pcl_point;
167 pcl_point.
x = p_map.
x;
168 pcl_point.y = p_map.
y;
169 pcl_point.z = p_map.
z;
173 combined_cloud->push_back(pcl_point);
179 pcl::PointXYZRGB pcl_point;
180 pcl_point.
x = p_map.
x;
181 pcl_point.y = p_map.
y;
182 pcl_point.z = p_map.
z;
186 combined_cloud->push_back(pcl_point);
190 sensor_msgs::PointCloud2 cloud_msg;
191 pcl::toROSMsg(*combined_cloud, cloud_msg);
192 cloud_msg.header.stamp = ros::Time::now();
193 cloud_msg.header.frame_id =
"map";
196 mask_pub_.publish(msg);
197 cloud_pub_.publish(cloud_msg);