22#include < cstdint>
33#include < sensor_msgs/image_encodings.h>
44#include < geometry_msgs/Vector3.h>
5- #include < geometry_msgs/Point.h>
5+ // #include <geometry_msgs/Point.h>
66
7- geometry_msgs::Vector3 getUnitTranslation (geometry_msgs::Point point){
7+
8+ geometry_msgs::Vector3 getUnitTranslation (cv::Point point, const cv::Mat& K){
89 geometry_msgs::Vector3 unit_translate;
9- unit_translate.x = (point.x - cx) / fx ;
10- unit_translate.y = (point.y - cy) / fy ;
10+ unit_translate.x = (point.x - K. at < double >( 0 , 2 )) / K. at < double >( 0 , 0 ) ;
11+ unit_translate.y = (point.y - K. at < double >( 1 , 2 )) / K. at < double >( 1 , 1 ) ;
1112 unit_translate.z = 1 ;
1213 return unit_translate;
1314}
@@ -59,10 +60,8 @@ EOD_ROS::EOD_ROS(ros::NodeHandle nh, ros::NodeHandle nh_p){
5960 }
6061 }
6162 }
62- ROS_INFO (" Selected to detect on start %i objects" , selected_simple_objects.size ());
63-
64-
65-
63+ ROS_INFO (" Selected to detect on start %li objects" , selected_simple_objects.size ());
64+
6665 // set up publishers
6766 simple_objects_pub_ = nh_p.advertise <extended_object_detection::SimpleObjectArray>(" simple_objects" ,1 );
6867
@@ -91,6 +90,16 @@ bool EOD_ROS::check_time(ros::Time stamp){
9190 return (stamp - prev_detected_time).toSec () > rate_limit_sec;
9291}
9392
93+ cv::Mat EOD_ROS::getK (const sensor_msgs::CameraInfoConstPtr& info_msg){
94+ cv::Mat K = cv::Mat::zeros (3 , 3 , CV_64F);
95+ for (size_t i=0 ; i<3 ; i++) {
96+ for (size_t j=0 ; j<3 ; j++) {
97+ K.at <double >(i, j) = info_msg->K [i*3 +j];
98+ }
99+ }
100+ return K;
101+ }
102+
94103void EOD_ROS::rgb_info_cb (const sensor_msgs::ImageConstPtr& rgb_image, const sensor_msgs::CameraInfoConstPtr& rgb_info){
95104 ROS_INFO (" Get Image!" );
96105
@@ -107,9 +116,12 @@ void EOD_ROS::rgb_info_cb(const sensor_msgs::ImageConstPtr& rgb_image, const sen
107116 }
108117 catch (cv_bridge::Exception& e){
109118 ROS_ERROR (" Could not convert from '%s' to 'bgr8'." , rgb_image->encoding .c_str ());
119+ return ;
110120 }
111121
112- detect (rgb, cv::Mat (), rgb_image->header );
122+ eod::InfoImage ii = eod::InfoImage (rgb, getK (rgb_info), cv::Mat () );
123+ detect (ii, eod::InfoImage (), rgb_image->header );
124+ // detect(rgb, cv::Mat(), rgb_image->header);
113125}
114126
115127void EOD_ROS::rgbd_info_cb (const sensor_msgs::ImageConstPtr& rgb_image, const sensor_msgs::CameraInfoConstPtr& rgb_info, const sensor_msgs::ImageConstPtr& depth_image, const sensor_msgs::CameraInfoConstPtr& depth_info){
@@ -128,6 +140,7 @@ void EOD_ROS::rgbd_info_cb(const sensor_msgs::ImageConstPtr& rgb_image, const se
128140 }
129141 catch (cv_bridge::Exception& e){
130142 ROS_ERROR (" Could not convert from '%s' to 'bgr8'." , rgb_image->encoding .c_str ());
143+ return ;
131144 }
132145
133146 cv::Mat depth;
@@ -141,10 +154,15 @@ void EOD_ROS::rgbd_info_cb(const sensor_msgs::ImageConstPtr& rgb_image, const se
141154 ROS_ERROR_THROTTLE (5 , " Depth image has unsupported encoding [%s]" , depth_image->encoding .c_str ());
142155 }
143156
144- detect (rgb, depth, rgb_image->header );
157+ eod::InfoImage ii_rgb = eod::InfoImage (rgb, getK (rgb_info), cv::Mat () );
158+ eod::InfoImage ii_depth = eod::InfoImage (depth, getK (depth_info), cv::Mat () );
159+
160+ detect (ii_rgb, ii_depth, rgb_image->header );
145161}
146162
147- void EOD_ROS::detect (const cv::Mat& rgb, const cv::Mat& depth, std_msgs::Header header){
163+ // void EOD_ROS::detect(const cv::Mat& rgb, const cv::Mat& depth, std_msgs::Header header){
164+ void EOD_ROS::detect (const eod::InfoImage& rgb, const eod::InfoImage& depth, std_msgs::Header header){
165+ ROS_INFO (" Detecting..." );
148166 prev_detected_time = ros::Time::now ();
149167
150168 cv::Mat image_to_draw;
@@ -157,10 +175,10 @@ void EOD_ROS::detect(const cv::Mat& rgb, const cv::Mat& depth, std_msgs::Header
157175
158176 // detect simple objects
159177 for (auto & s_it : selected_simple_objects){
160- s_it-> Identify (rgb, depth, frame_sequence );
161-
162- add_data_to_simple_msg (s_it, simples_msg );
163-
178+ // ROS_INFO("Identifiyng..." );
179+ s_it-> Identify (rgb, depth, frame_sequence);
180+ // ROS_INFO("Adding..." );
181+ add_data_to_simple_msg (&(*s_it), simples_msg, rgb. K );
164182 }
165183
166184 simples_msg.header = header;
@@ -172,29 +190,30 @@ void EOD_ROS::detect(const cv::Mat& rgb, const cv::Mat& depth, std_msgs::Header
172190 frame_sequence++;
173191}
174192
175- void EOD_ROS::add_data_to_simple_msg (const eod::SimpleObject* so, extended_object_detection::SimpleObjectArray& msg){
193+ void EOD_ROS::add_data_to_simple_msg ( eod::SimpleObject* so, extended_object_detection::SimpleObjectArray& msg, const cv::Mat& K ){
176194 for (auto & eoi : so->objects ){
177- msg.objects .push_back (eoi_to_base_object (so, &eoi));
195+ msg.objects .push_back (eoi_to_base_object (so, &eoi, K ));
178196 }
179197}
180198
181- extended_object_detection::BaseObject EOD_ROS::eoi_to_base_object (const eod::SimpleObject* so, const eod::ExtendedObjectInfo* eoi){
199+ extended_object_detection::BaseObject EOD_ROS::eoi_to_base_object ( eod::SimpleObject* so, eod::ExtendedObjectInfo* eoi, const cv::Mat& K){
200+ // ROS_INFO("Forming...");
182201 extended_object_detection::BaseObject bo;
183202 // common
184203 bo.type_id = so->ID ;
185204 bo.type_name = so->name ;
186205 bo.score = eoi->total_score ;
187206
188- for ( auto const & exi : eoi->extracted_info ){
207+ for ( auto & exi : eoi->extracted_info ){
189208 bo.extracted_info .keys .push_back (exi.first );
190209 bo.extracted_info .values .push_back (exi.second );
191210 }
192211
193212 // rect
194213 bo.rect .left_bottom .x = eoi->x ;
195214 bo.rect .left_bottom .y = eoi->y ;
196- bo.rect .right_bottom .x = eoi->x + eoi->width ;
197- bo.rect .right_bottom .y = eoi->y + eoi->height ;
215+ bo.rect .right_up .x = eoi->x + eoi->width ;
216+ bo.rect .right_up .y = eoi->y + eoi->height ;
198217
199218 // transform
200219 if ( eoi->tvec .size () > 0 ){
@@ -203,7 +222,7 @@ extended_object_detection::BaseObject EOD_ROS::eoi_to_base_object(const eod::Sim
203222 bo.transform .translation .z = eoi->tvec [0 ][2 ];
204223 }
205224 else {
206- bo.transform .translation = getUnitTranslation (ext_obj ->getCenter ());
225+ bo.transform .translation = getUnitTranslation (eoi ->getCenter (), K );
207226 }
208227
209228
0 commit comments