29 #include <find_object_2d/ObjectsStamped.h> 35 #include <opencv2/opencv.hpp> 47 const std_msgs::Float32MultiArrayConstPtr & msg)
50 const std::vector<float> & data = msg->data;
53 for(
unsigned int i=0; i<data.size(); i+=12)
56 int id = (int)data[i];
57 float objectWidth = data[i+1];
58 float objectHeight = data[i+2];
61 QTransform qtHomography(data[i+3], data[i+4], data[i+5],
62 data[i+6], data[i+7], data[i+8],
63 data[i+9], data[i+10], data[i+11]);
65 QPointF qtTopLeft = qtHomography.map(QPointF(0,0));
66 QPointF qtTopRight = qtHomography.map(QPointF(objectWidth,0));
67 QPointF qtBottomLeft = qtHomography.map(QPointF(0,objectHeight));
68 QPointF qtBottomRight = qtHomography.map(QPointF(objectWidth,objectHeight));
70 printf(
"Object %d detected, Qt corners at (%f,%f) (%f,%f) (%f,%f) (%f,%f)\n",
72 qtTopLeft.x(), qtTopLeft.y(),
73 qtTopRight.x(), qtTopRight.y(),
74 qtBottomLeft.x(), qtBottomLeft.y(),
75 qtBottomRight.x(), qtBottomRight.y());
80 printf(
"No objects detected.\n");
84 const sensor_msgs::ImageConstPtr & imageMsg,
85 const find_object_2d::ObjectsStampedConstPtr & objectsMsg)
89 const std::vector<float> & data = objectsMsg->objects.data;
92 for(
unsigned int i=0; i<data.size(); i+=12)
95 int id = (int)data[i];
96 float objectWidth = data[i+1];
97 float objectHeight = data[i+2];
100 cv::Mat cvHomography(3, 3, CV_32F);
101 cvHomography.at<
float>(0,0) = data[i+3];
102 cvHomography.at<
float>(1,0) = data[i+4];
103 cvHomography.at<
float>(2,0) = data[i+5];
104 cvHomography.at<
float>(0,1) = data[i+6];
105 cvHomography.at<
float>(1,1) = data[i+7];
106 cvHomography.at<
float>(2,1) = data[i+8];
107 cvHomography.at<
float>(0,2) = data[i+9];
108 cvHomography.at<
float>(1,2) = data[i+10];
109 cvHomography.at<
float>(2,2) = data[i+11];
110 std::vector<cv::Point2f> inPts, outPts;
111 inPts.push_back(cv::Point2f(0,0));
112 inPts.push_back(cv::Point2f(objectWidth,0));
113 inPts.push_back(cv::Point2f(objectWidth,objectHeight));
114 inPts.push_back(cv::Point2f(0,objectHeight));
115 inPts.push_back(cv::Point2f(objectWidth/2,objectHeight/2));
116 cv::perspectiveTransform(inPts, outPts, cvHomography);
121 img = *imageDepthPtr;
122 std::vector<cv::Point2i> outPtsInt;
123 outPtsInt.push_back(outPts[0]);
124 outPtsInt.push_back(outPts[1]);
125 outPtsInt.push_back(outPts[2]);
126 outPtsInt.push_back(outPts[3]);
127 QColor color(QColor((Qt::GlobalColor)((
id % 10 + 7)==Qt::yellow?Qt::darkYellow:(
id % 10 + 7))));
128 cv::Scalar cvColor(color.red(), color.green(), color.blue());
129 cv::polylines(img.
image, outPtsInt,
true, cvColor, 3);
130 cv::Point2i center = outPts[4];
131 cv::putText(img.
image, QString(
"(%1, %2)").arg(center.x).arg(center.y).toStdString(), center, cv::FONT_HERSHEY_SIMPLEX, 0.6, cvColor, 2);
132 cv::circle(img.
image, center, 1, cvColor, 3);
141 int main(
int argc,
char** argv)
143 ros::init(argc, argv,
"objects_detected");
156 objectsSub.
subscribe(nh,
"objectsStamped", 1);
160 imagePub = it.
advertise(
"image_with_objects", 1);
CvImageConstPtr toCvShare(const sensor_msgs::ImageConstPtr &source, const std::string &encoding=std::string())
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
std::string resolveName(const std::string &name, bool remap=true) const
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
Publisher advertise(const std::string &base_topic, uint32_t queue_size, bool latch=false)
message_filters::sync_policies::ExactTime< sensor_msgs::Image, find_object_2d::ObjectsStamped > MyExactSyncPolicy
uint32_t getNumSubscribers() const
ROSCPP_DECL void spin(Spinner &spinner)
Connection registerCallback(C &callback)
void objectsDetectedCallback(const std_msgs::Float32MultiArrayConstPtr &msg)
image_transport::Publisher imagePub
void publish(const sensor_msgs::Image &message) const
void subscribe(ImageTransport &it, const std::string &base_topic, uint32_t queue_size, const TransportHints &transport_hints=TransportHints())
void subscribe(ros::NodeHandle &nh, const std::string &topic, uint32_t queue_size, const ros::TransportHints &transport_hints=ros::TransportHints(), ros::CallbackQueueInterface *callback_queue=0)
int main(int argc, char **argv)
void imageObjectsDetectedCallback(const sensor_msgs::ImageConstPtr &imageMsg, const find_object_2d::ObjectsStampedConstPtr &objectsMsg)
sensor_msgs::ImagePtr toImageMsg() const