Skip to content

Commit

Permalink
release 3.6
Browse files Browse the repository at this point in the history
  • Loading branch information
adujardin committed Oct 20, 2021
1 parent 814a368 commit b0ad7a9
Show file tree
Hide file tree
Showing 121 changed files with 8,642 additions and 392 deletions.
2 changes: 1 addition & 1 deletion body tracking/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@
![](body_tracking.jpg)


>*NOTE: A [ZED 2](https://store.stereolabs.com/products/zed-2) is required to use this module.*
>*NOTE: The ZED v1 is not compatible with this module*
2 changes: 1 addition & 1 deletion body tracking/cpp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ This sample shows how to detect and track human bodies in space.
- Build for [Linux/Jetson](https://www.stereolabs.com/docs/app-development/cpp/linux/)

## Run the program
*NOTE: A [ZED 2](https://store.stereolabs.com/products/zed-2) is required to use this module.*
*NOTE: The ZED v1 is not compatible with this module*
- Navigate to the build directory and launch the executable
- Or open a terminal in the build directory and run the sample :

Expand Down
3 changes: 2 additions & 1 deletion body tracking/cpp/include/GLViewer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ class GLViewer {
GLViewer();
~GLViewer();
bool isAvailable();
void init(int argc, char **argv, sl::CameraParameters& param, bool isTrackingON);
void init(int argc, char **argv, sl::CameraParameters& param, bool isTrackingON, sl::BODY_FORMAT body_format);
void updateData(sl::Mat &matXYZRGBA, std::vector<sl::ObjectData> &objs, sl::Transform& pose);
void exit();
void setFloorPlaneEquation(sl::float4 eq);
Expand Down Expand Up @@ -370,6 +370,7 @@ class GLViewer {

bool showPC = false;
bool isTrackingON_ = false;
sl::BODY_FORMAT body_format_ = sl::BODY_FORMAT::POSE_18;
};

#endif /* __VIEWER_INCLUDE__ */
2 changes: 1 addition & 1 deletion body tracking/cpp/include/TrackingViewer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ inline sl::float2 getImagePosition(std::vector<sl::uint2> &bounding_box_image, s
return position;
}

void render_2D(cv::Mat &left, sl::float2 img_scale, std::vector<sl::ObjectData> &objects, bool isTrackingON);
void render_2D(cv::Mat &left, sl::float2 img_scale, std::vector<sl::ObjectData> &objects, bool isTrackingON, sl::BODY_FORMAT body_format);

inline cv::Mat slMat2cvMat(sl::Mat& input) {
// Mapping between MAT_TYPE and CV_TYPE
Expand Down
63 changes: 41 additions & 22 deletions body tracking/cpp/src/GLViewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ bool GLViewer::isAvailable() {

void CloseFunc(void) { if (currentInstance_) currentInstance_->exit(); }

void GLViewer::init(int argc, char **argv, sl::CameraParameters &param, bool isTrackingON) {
void GLViewer::init(int argc, char **argv, sl::CameraParameters &param, bool isTrackingON, sl::BODY_FORMAT body_format) {

glutInit(&argc, argv);
int wnd_w = glutGet(GLUT_SCREEN_WIDTH);
Expand Down Expand Up @@ -169,6 +169,7 @@ void GLViewer::init(int argc, char **argv, sl::CameraParameters &param, bool isT

floor_plane_set = false;
isTrackingON_ = isTrackingON;
body_format_ = body_format;
// Set background color (black)
bckgrnd_clr = sl::float4(0.2f, 0.19f, 0.2f, 1.0f);

Expand Down Expand Up @@ -268,32 +269,50 @@ void GLViewer::updateData(sl::Mat &matXYZRGBA, std::vector<sl::ObjectData> &objs
// draw skeletons
auto clr_id = generateColorID(objs[i].id);
if (objs[i].keypoint.size()) {
for (auto& limb : SKELETON_BONES) {
sl::float3 kp_1 = objs[i].keypoint[getIdx(limb.first)];
sl::float3 kp_2 = objs[i].keypoint[getIdx(limb.second)];
float norm_1 = kp_1.norm();
float norm_2 = kp_2.norm();
if (body_format_ == sl::BODY_FORMAT::POSE_18) {
for (auto& limb : SKELETON_BONES) {
sl::float3 kp_1 = objs[i].keypoint[getIdx(limb.first)];
sl::float3 kp_2 = objs[i].keypoint[getIdx(limb.second)];
float norm_1 = kp_1.norm();
float norm_2 = kp_2.norm();
// draw cylinder between two keypoints
if (std::isfinite(norm_1) && std::isfinite(norm_2)) {
skeletons.addCylinder(kp_1, kp_2, clr_id);
}
}
// Create bone between spine and neck (not existing in sl::BODY_BONES)
sl::float3 spine = (objs[i].keypoint[getIdx(sl::BODY_PARTS::LEFT_HIP)] + objs[i].keypoint[getIdx(sl::BODY_PARTS::RIGHT_HIP)]) / 2; // Create new KP (spine for rendering)
sl::float3 neck = objs[i].keypoint[getIdx(sl::BODY_PARTS::NECK)];
float norm_1 = spine.norm();
float norm_2 = neck.norm();
// draw cylinder between two keypoints
if (std::isfinite(norm_1) && std::isfinite(norm_2)) {
skeletons.addCylinder(kp_1, kp_2, clr_id);
skeletons.addCylinder(spine, neck, clr_id);
}
}
// Create bone between spine and neck (not existing in sl::BODY_BONES)
sl::float3 spine = (objs[i].keypoint[getIdx(sl::BODY_PARTS::LEFT_HIP)] + objs[i].keypoint[getIdx(sl::BODY_PARTS::RIGHT_HIP)]) / 2; // Create new KP (spine for rendering)
sl::float3 neck = objs[i].keypoint[getIdx(sl::BODY_PARTS::NECK)];
float norm_1 = spine.norm();
float norm_2 = neck.norm();
// draw cylinder between two keypoints
if (std::isfinite(norm_1) && std::isfinite(norm_2)) {
skeletons.addCylinder(spine, neck, clr_id);
}

for (int j = 0; j < static_cast<int>(sl::BODY_PARTS::LAST); j++) {
sl::float3 kp = objs[i].keypoint[j];
if (std::isfinite(kp.norm()))skeletons.addSphere(kp, clr_id);
for (int j = 0; j < static_cast<int>(sl::BODY_PARTS::LAST); j++) {
sl::float3 kp = objs[i].keypoint[j];
if (std::isfinite(kp.norm()))skeletons.addSphere(kp, clr_id);
}
// Add Sphere at the Spine position
if (std::isfinite(spine.norm()))skeletons.addSphere(spine, clr_id);
}
else if (body_format_ == sl::BODY_FORMAT::POSE_34) {
for (auto& limb : sl::BODY_BONES_POSE_34) {
sl::float3 kp_1 = objs[i].keypoint[getIdx(limb.first)];
sl::float3 kp_2 = objs[i].keypoint[getIdx(limb.second)];
float norm_1 = kp_1.norm();
float norm_2 = kp_2.norm();
// draw cylinder between two keypoints
if (std::isfinite(norm_1) && std::isfinite(norm_2)) {
skeletons.addCylinder(kp_1, kp_2, clr_id);
}
}
for (int j = 0; j < static_cast<int>(sl::BODY_PARTS_POSE_34::LAST); j++) {
sl::float3 kp = objs[i].keypoint[j];
if (std::isfinite(kp.norm()))skeletons.addSphere(kp, clr_id);
}
}
// Add Sphere at the Spine position
if (std::isfinite(spine.norm()))skeletons.addSphere(spine, clr_id);
}
}
}
Expand Down
98 changes: 62 additions & 36 deletions body tracking/cpp/src/TrackingViewer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ inline cv::Point2f cvt(T pt, sl::float2 scale) {
return cv::Point2f(pt.x * scale.x, pt.y * scale.y);
}

void render_2D(cv::Mat &left_display, sl::float2 img_scale, std::vector<sl::ObjectData> &objects, bool isTrackingON) {
void render_2D(cv::Mat &left_display, sl::float2 img_scale, std::vector<sl::ObjectData> &objects, bool isTrackingON, sl::BODY_FORMAT body_format) {
cv::Mat overlay = left_display.clone();
cv::Rect roi_render(0, 0, left_display.size().width, left_display.size().height);

Expand All @@ -19,49 +19,75 @@ void render_2D(cv::Mat &left_display, sl::float2 img_scale, std::vector<sl::Obje
if (renderObject(obj, isTrackingON)) {
if (obj.keypoint_2d.size()) {
cv::Scalar color = generateColorID_u(obj.id);
// skeleton bones
for (const auto& parts : SKELETON_BONES) {
auto kp_a = cvt(obj.keypoint_2d[getIdx(parts.first)], img_scale);
auto kp_b = cvt(obj.keypoint_2d[getIdx(parts.second)], img_scale);
if (roi_render.contains(kp_a) && roi_render.contains(kp_b))
{
if (body_format == sl::BODY_FORMAT::POSE_18) {
// skeleton bones
for (const auto& parts : SKELETON_BONES) {
auto kp_a = cvt(obj.keypoint_2d[getIdx(parts.first)], img_scale);
auto kp_b = cvt(obj.keypoint_2d[getIdx(parts.second)], img_scale);
if (roi_render.contains(kp_a) && roi_render.contains(kp_b))
{

#if (defined(CV_VERSION_EPOCH) && CV_VERSION_EPOCH == 2)
cv::line(left_display, kp_a, kp_b, color, 1);
#else
cv::line(left_display, kp_a, kp_b, color, 1, cv::LINE_AA);
#endif
}
}
auto hip_left = obj.keypoint_2d[getIdx(sl::BODY_PARTS::LEFT_HIP)];
auto hip_right = obj.keypoint_2d[getIdx(sl::BODY_PARTS::RIGHT_HIP)];
auto spine = (hip_left + hip_right) / 2;
auto neck = obj.keypoint_2d[getIdx(sl::BODY_PARTS::NECK)];
#if (defined(CV_VERSION_EPOCH) && CV_VERSION_EPOCH == 2)
cv::line(left_display, kp_a, kp_b, color, 1);
#else
cv::line(left_display, kp_a, kp_b, color, 1, cv::LINE_AA);
#endif
}
}
auto hip_left = obj.keypoint_2d[getIdx(sl::BODY_PARTS::LEFT_HIP)];
auto hip_right = obj.keypoint_2d[getIdx(sl::BODY_PARTS::RIGHT_HIP)];
auto spine = (hip_left + hip_right) / 2;
auto neck = obj.keypoint_2d[getIdx(sl::BODY_PARTS::NECK)];

if (hip_left.x > 0 && hip_left.y > 0 && hip_right.x > 0 && hip_right.y > 0 && neck.x > 0 && neck.y > 0) {
if (hip_left.x > 0 && hip_left.y > 0 && hip_right.x > 0 && hip_right.y > 0 && neck.x > 0 && neck.y > 0) {

auto kp_a = cvt(spine, img_scale);
auto kp_b = cvt(obj.keypoint_2d[getIdx(sl::BODY_PARTS::NECK)], img_scale);
if (roi_render.contains(kp_a) && roi_render.contains(kp_b))
{
#if (defined(CV_VERSION_EPOCH) && CV_VERSION_EPOCH == 2)
cv::line(left_display, kp_a, kp_b, color, 1);
#else
cv::line(left_display, kp_a, kp_b, color, 1, cv::LINE_AA);
#endif
auto kp_a = cvt(spine, img_scale);
auto kp_b = cvt(obj.keypoint_2d[getIdx(sl::BODY_PARTS::NECK)], img_scale);
if (roi_render.contains(kp_a) && roi_render.contains(kp_b))
{
#if (defined(CV_VERSION_EPOCH) && CV_VERSION_EPOCH == 2)
cv::line(left_display, kp_a, kp_b, color, 1);
#else
cv::line(left_display, kp_a, kp_b, color, 1, cv::LINE_AA);
#endif
}
}
}

// skeleton joints
for (auto& kp : obj.keypoint_2d) {
cv::Point2f cv_kp = cvt(kp, img_scale);
if (roi_render.contains(cv_kp))
// skeleton joints
for (auto& kp : obj.keypoint_2d) {
cv::Point2f cv_kp = cvt(kp, img_scale);
if (roi_render.contains(cv_kp))
cv::circle(left_display, cv_kp, 3, color, -1);
}
cv::Point2f cv_kp = cvt(spine, img_scale);
if (hip_left.x > 0 && hip_left.y > 0 && hip_right.x > 0 && hip_right.y > 0)
cv::circle(left_display, cv_kp, 3, color, -1);
}
cv::Point2f cv_kp = cvt(spine, img_scale);
if (hip_left.x > 0 && hip_left.y > 0 && hip_right.x > 0 && hip_right.y > 0)
cv::circle(left_display, cv_kp, 3, color, -1);
else if (body_format == sl::BODY_FORMAT::POSE_34) {
// skeleton bones
for (const auto& parts : sl::BODY_BONES_POSE_34) {
auto kp_a = cvt(obj.keypoint_2d[getIdx(parts.first)], img_scale);
auto kp_b = cvt(obj.keypoint_2d[getIdx(parts.second)], img_scale);
if (roi_render.contains(kp_a) && roi_render.contains(kp_b))
{

#if (defined(CV_VERSION_EPOCH) && CV_VERSION_EPOCH == 2)
cv::line(left_display, kp_a, kp_b, color, 1);
#else
cv::line(left_display, kp_a, kp_b, color, 1, cv::LINE_AA);
#endif
}
}

// skeleton joints
for (auto& kp : obj.keypoint_2d) {
cv::Point2f cv_kp = cvt(kp, img_scale);
if (roi_render.contains(cv_kp))
cv::circle(left_display, cv_kp, 3, color, -1);
}
}
}

}
}
// Here, overlay is as the left image, but with opaque masks on each detected objects
Expand Down
9 changes: 5 additions & 4 deletions body tracking/cpp/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ int main(int argc, char **argv) {
// On Jetson the object detection combined with an heavy depth mode could reduce the frame rate too much
init_parameters.depth_mode = isJetson ? DEPTH_MODE::PERFORMANCE : DEPTH_MODE::ULTRA;
init_parameters.coordinate_system = COORDINATE_SYSTEM::RIGHT_HANDED_Y_UP;

parseArgs(argc, argv, init_parameters);

// Open the camera
Expand All @@ -66,7 +67,7 @@ int main(int argc, char **argv) {
// Enable Positional tracking (mandatory for object detection)
PositionalTrackingParameters positional_tracking_parameters;
//If the camera is static, uncomment the following line to have better performances and boxes sticked to the ground.
//positional_tracking_parameters.set_as_static = true;

returned_state = zed.enablePositionalTracking(positional_tracking_parameters);
if (returned_state != ERROR_CODE::SUCCESS) {
print("enable Positional Tracking", returned_state, "\nExit program.");
Expand All @@ -78,8 +79,8 @@ int main(int argc, char **argv) {
ObjectDetectionParameters obj_det_params;
obj_det_params.enable_tracking = true; // track people across images flow
obj_det_params.enable_body_fitting = false; // smooth skeletons moves
obj_det_params.body_format = sl::BODY_FORMAT::POSE_34;
obj_det_params.detection_model = isJetson ? DETECTION_MODEL::HUMAN_BODY_FAST : DETECTION_MODEL::HUMAN_BODY_ACCURATE;

returned_state = zed.enableObjectDetection(obj_det_params);
if (returned_state != ERROR_CODE::SUCCESS) {
print("enable Object Detection", returned_state, "\nExit program.");
Expand All @@ -102,7 +103,7 @@ int main(int argc, char **argv) {
Mat point_cloud(pc_resolution, MAT_TYPE::F32_C4, MEM::GPU);
// Create OpenGL Viewer
GLViewer viewer;
viewer.init(argc, argv, camera_parameters, obj_det_params.enable_tracking);
viewer.init(argc, argv, camera_parameters, obj_det_params.enable_tracking, obj_det_params.body_format);

Pose cam_pose;
cam_pose.pose_data.setIdentity();
Expand Down Expand Up @@ -151,7 +152,7 @@ int main(int argc, char **argv) {
if (is_playback && zed.getSVOPosition() == zed.getSVONumberOfFrames()) {
quit = true;
}
render_2D(image_left_ocv, img_scale, bodies.object_list, obj_det_params.enable_tracking);
render_2D(image_left_ocv, img_scale, bodies.object_list, obj_det_params.enable_tracking, obj_det_params.body_format);
cv::imshow(window_name, image_left_ocv);
key = cv::waitKey(10);
}
Expand Down
6 changes: 3 additions & 3 deletions body tracking/csharp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,14 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY VS_DOTNET_REFERENCES
"System.Windows"
"System.Windows.Forms"
"System.Numerics"
"System.Drawing"
"WindowsBase"

)

set(CMAKE_SUPPRESS_REGENERATION true)
set_property(TARGET ${PROJECT_NAME} PROPERTY VS_PACKAGE_REFERENCES
"Stereolabs.zed_3.6.0"
"OpenGL.Net_0.8.4"
"OpenGL.Net.CoreUI_0.8.4"
"OpenCvSharp4.Windows_4.5.0.20201013"
"Stereolabs.zed_3.5.0"
"sl_zed_interface_3.5.0"
)
Loading

0 comments on commit b0ad7a9

Please sign in to comment.