32 #include <OGRE/OgreCamera.h> 
   33 #include <OGRE/OgreManualObject.h> 
   34 #include <OGRE/OgreMaterialManager.h> 
   35 #include <OGRE/OgreRectangle2D.h> 
   36 #include <OGRE/OgreRenderSystem.h> 
   37 #include <OGRE/OgreRenderWindow.h> 
   38 #include <OGRE/OgreRoot.h> 
   39 #include <OGRE/OgreSceneManager.h> 
   40 #include <OGRE/OgreSceneNode.h> 
   41 #include <OGRE/OgreTechnique.h> 
   42 #include <OGRE/OgreTextureManager.h> 
   43 #include <OGRE/OgreViewport.h> 
   45 #include <hri_msgs/IdsList.h> 
   46 #include <hri_msgs/NormalizedPointOfInterest2D.h> 
   47 #include <hri_msgs/Skeleton2D.h> 
   57 #include <boost/bind.hpp> 
   58 #include <opencv2/opencv.hpp> 
   61 #include <unordered_map> 
   64 #define SKELETON_POINTS 18 
   66 #define JOINT_RADIUS 8 
   72   size_t hash = hasher(
id);
 
   74   cv::Mat3f hsv(cv::Vec3f(rand() % 360, 0.7, 0.8));
 
   76   cv::cvtColor(hsv, bgr, cv::COLOR_HSV2BGR);
 
   77   return cv::Scalar(bgr(0, 0) * 255);
 
   80 int clip(
int n, 
int lower, 
int upper){
 
   81   return std::max(lower, std::min(n, upper));
 
   88                        "If set to true, will try to estimate the range of " 
   89                        "possible values from the received images.",
 
   93                                     "Value which will be displayed as black.",
 
   97                                     "Value which will be displayed as white.",
 
  102       "Window size for median filter used for computin min/max.", 
this,
 
  106       "Show face RoIs", 
true, 
"If set to true, show faces bounding boxes.",
 
  110       "Show facial landmarks", 
true, 
"If set to true, show faces facial landmarks.",
 
  114       "Show body RoIs", 
true, 
"If set to true, show bodies bounding boxes.",
 
  118       "Show 2D Skeletons", 
true, 
"If set to true, show 2D skeletons.",
 
  131     static uint32_t count = 0;
 
  132     std::stringstream ss;
 
  133     ss << 
"HumansDisplay" << count++;
 
  135         Ogre::ST_GENERIC, ss.str());
 
  142     static int count = 0;
 
  143     std::stringstream ss;
 
  144     ss << 
"HumansDisplayObject" << count++;
 
  147     screen_rect_->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY - 1);
 
  151     material_ = Ogre::MaterialManager::getSingleton().create(
 
  152         ss.str(), Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
 
  153     material_->setSceneBlending(Ogre::SBT_REPLACE);
 
  158     material_->getTechnique(0)->setLightingEnabled(
false);
 
  159     Ogre::TextureUnitState* tu =
 
  160         material_->getTechnique(0)->getPass(0)->createTextureUnitState();
 
  162     tu->setTextureFiltering(Ogre::TFO_NONE);
 
  164     material_->setCullingMode(Ogre::CULL_NONE);
 
  165     Ogre::AxisAlignedBox aabInf;
 
  166     aabInf.setInfinite();
 
  257     if (img_width != 0 && img_height != 0 && win_width != 0 &&
 
  259       float img_aspect = img_width / img_height;
 
  260       float win_aspect = win_width / win_height;
 
  262       if (img_aspect > win_aspect) {
 
  264                                  -1.0
f * win_aspect / img_aspect, 
false);
 
  267                                  1.0
f * img_aspect / win_aspect, -1.0
f, 
false);
 
  281       Ogre::Vector3(999999, 999999, 999999));
 
  297     int neckX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::NECK].x*width), 0, width);
 
  298     int neckY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::NECK].y*height), 0, height);
 
  302     int rightShoulderX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_SHOULDER].x*width), 0, width);
 
  303     int rightShoulderY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_SHOULDER].y*height), 0, height);
 
  305     cv::circle(
cvBridge_->image, cv::Point(rightShoulderX, rightShoulderY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  307     int rightHipX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_HIP].x*width), 0, width);
 
  308     int rightHipY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_HIP].y*height), 0, height);
 
  310     cv::circle(
cvBridge_->image, cv::Point(rightHipX, rightHipY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);    
 
  312     int leftHipX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_HIP].x*width), 0, width);
 
  313     int leftHipY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_HIP].y*height), 0, height);
 
  315     cv::circle(
cvBridge_->image, cv::Point(leftHipX, leftHipY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  317     int leftShoulderX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_SHOULDER].x*width), 0, width);
 
  318     int leftShoulderY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_SHOULDER].y*height), 0, height);
 
  320     cv::circle(
cvBridge_->image, cv::Point(leftShoulderX, leftShoulderY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  322     int rightElbowX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_ELBOW].x*width), 0, width);
 
  323     int rightElbowY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_ELBOW].y*height), 0, height);
 
  325     cv::circle(
cvBridge_->image, cv::Point(rightElbowX, rightElbowY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  327     int rightWristX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_WRIST].x*width), 0, width);
 
  328     int rightWristY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_WRIST].y*height), 0, height);
 
  330     cv::circle(
cvBridge_->image, cv::Point(rightWristX, rightWristY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  332     int leftElbowX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_ELBOW].x*width), 0, width);
 
  333     int leftElbowY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_ELBOW].y*height), 0, height);
 
  335     cv::circle(
cvBridge_->image, cv::Point(leftElbowX, leftElbowY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  337     int leftWristX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_WRIST].x*width), 0, width);
 
  338     int leftWristY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_WRIST].y*height), 0, height);
 
  340     cv::circle(
cvBridge_->image, cv::Point(leftWristX, leftWristY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  342     int rightKneeX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_KNEE].x*width), 0, width);
 
  343     int rightKneeY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_KNEE].y*height), 0, height);
 
  345     cv::circle(
cvBridge_->image, cv::Point(rightKneeX, rightKneeY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  347     int rightAnkleX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_ANKLE].x*width), 0, width);
 
  348     int rightAnkleY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::RIGHT_ANKLE].y*height), 0, height);
 
  350     cv::circle(
cvBridge_->image, cv::Point(rightAnkleX, rightAnkleY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  352     int leftKneeX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_KNEE].x*width), 0, width);
 
  353     int leftKneeY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_KNEE].y*height), 0, height);
 
  355     cv::circle(
cvBridge_->image, cv::Point(leftKneeX, leftKneeY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  357     int leftAnkleX = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_ANKLE].x*width), 0, width);
 
  358     int leftAnkleY = 
clip((
int)(skeleton[hri_msgs::Skeleton2D::LEFT_ANKLE].y*height), 0, height);
 
  360     cv::circle(
cvBridge_->image, cv::Point(leftAnkleX, leftAnkleY), 
JOINT_RADIUS, skeletonColor, cv::FILLED);
 
  363     cv::line(
cvBridge_->image, cv::Point(neckX, neckY), cv::Point(rightShoulderX, rightShoulderY), skeletonColor, 5, cv::FILLED);
 
  364     cv::line(
cvBridge_->image, cv::Point(rightHipX, rightHipY), cv::Point(rightShoulderX, rightShoulderY), skeletonColor, 5, cv::FILLED);
 
  365     cv::line(
cvBridge_->image, cv::Point(neckX, neckY), cv::Point(leftShoulderX, leftShoulderY), skeletonColor, 5, cv::FILLED);
 
  366     cv::line(
cvBridge_->image, cv::Point(leftHipX, leftHipY), cv::Point(leftShoulderX, leftShoulderY), skeletonColor, 5, cv::FILLED);
 
  367     cv::line(
cvBridge_->image, cv::Point(leftHipX, leftHipY), cv::Point(rightHipX, rightHipY), skeletonColor, 5, cv::FILLED);
 
  370     cv::line(
cvBridge_->image, cv::Point(rightShoulderX, rightShoulderY), cv::Point(rightElbowX, rightElbowY), skeletonColor, 5, cv::FILLED);
 
  371     cv::line(
cvBridge_->image, cv::Point(rightElbowX, rightElbowY), cv::Point(rightWristX, rightWristY), skeletonColor, 5, cv::FILLED);
 
  374     cv::line(
cvBridge_->image, cv::Point(leftShoulderX, leftShoulderY), cv::Point(leftElbowX, leftElbowY), skeletonColor, 5, cv::FILLED);
 
  375     cv::line(
cvBridge_->image, cv::Point(leftElbowX, leftElbowY), cv::Point(leftWristX, leftWristY), skeletonColor, 5, cv::FILLED);
 
  378     cv::line(
cvBridge_->image, cv::Point(rightHipX, rightHipY), cv::Point(rightKneeX, rightKneeY), skeletonColor, 5, cv::FILLED);
 
  379     cv::line(
cvBridge_->image, cv::Point(rightKneeX, rightKneeY), cv::Point(rightAnkleX, rightAnkleY), skeletonColor, 5, cv::FILLED);
 
  382     cv::line(
cvBridge_->image, cv::Point(leftHipX, leftHipY), cv::Point(leftKneeX, leftKneeY), skeletonColor, 5, cv::FILLED);
 
  383     cv::line(
cvBridge_->image, cv::Point(leftKneeX, leftKneeY), cv::Point(leftAnkleX, leftAnkleY), skeletonColor, 5, cv::FILLED);
 
  389   bool got_float_image =
 
  409     for (
auto const& 
face : faces) {
 
  411               face.second.lock()) {  
 
  413           auto roi = face_ptr->roi();
 
  414           cv::Point roi_tl(
static_cast<int>(roi.xmin * msg->width),
 
  415                            static_cast<int>(roi.ymin * msg->height));
 
  416           cv::Point roi_br(
static_cast<int>(roi.xmax * msg->width),
 
  417                            static_cast<int>(roi.ymax * msg->height));
 
  421           auto landmarks = *(face_ptr->facialLandmarks()); 
 
  422           for(
auto landmark : landmarks){
 
  423             if(landmark.x > 0 || landmark.y > 0)
 
  425                          cv::Point(
static_cast<int>(landmark.x*msg->width), 
static_cast<int>(landmark.y*msg->height)),
 
  436     for (
auto const& 
body : bodies) {
 
  438               body.second.lock()) {  
 
  440           auto roi = body_ptr->roi();
 
  441           cv::Point roi_tl(
static_cast<int>(roi.xmin * msg->width),
 
  442                            static_cast<int>(roi.ymin * msg->height));
 
  443           cv::Point roi_br(
static_cast<int>(roi.xmax * msg->width),
 
  444                            static_cast<int>(roi.ymax * msg->height));
 
  448           auto skeleton = body_ptr->skeleton();