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();