@@ -1023,51 +1023,51 @@ if __name__ == '__main__':
10231023Here is a basic example of SDK C++ API:
10241024
10251025``` C++ 
1026- #include  " mmdeploy/detector .hpp" 
1027- 
1028- #include  " opencv2/imgcodecs/imgcodecs .hpp" 
1029- #include  " utils/argparse.h" 
1030- # include   " utils/visualize.h " 
1031- 
1032- DEFINE_ARG_string (model , "Model  path");
1033- DEFINE_ARG_string(image , "Input image path ");
1034- DEFINE_string(device, "cpu" , R"(Device name, e.g. "cpu", "cuda" )");
1035- DEFINE_string(output, "detector_output.jpg", "Output image path ");
1036- 
1037- DEFINE_double(det_thr, .5, "Detection score threshold ");
1026+ #include  " mmdeploy/pose_detector .hpp" 
1027+ # include   " opencv2/imgcodecs.hpp " 
1028+ #include  " opencv2/imgproc .hpp" 
1029+ #include  " utils/argparse.h"   //  See: https://github.com/open-mmlab/mmdeploy/blob/main/demo/csrc/cpp/utils/argparse.h 
1030+ 
1031+ DEFINE_ARG_string (model_path, "Model path"); 
1032+ DEFINE_ARG_string(image_path , "Input image  path");
1033+ DEFINE_string(device_name , "cpu", R"(Device name, e.g. "cpu", "cuda") ");
1034+ DEFINE_int32(bbox_x, -1 , R"(x position of the bounding box )");
1035+ DEFINE_int32(bbox_y, -1, R"(y position of the bounding box) ");
1036+ DEFINE_int32(bbox_w, -1, R"(width of the bounding box)"); 
1037+ DEFINE_int32(bbox_h, -1, R"(height of the bounding box) ");
10381038
10391039int main(int argc, char*  argv[ ] ) {
10401040  if (!utils::ParseArguments(argc, argv)) {
10411041    return -1;
10421042  }
10431043
1044-   cv::Mat img = cv::imread(ARGS_image);
1045-   if (img.empty()) {
1046-     fprintf(stderr, "failed to load image: %s\n", ARGS_image.c_str());
1047-     return -1;
1048-   }
1044+   cv::Mat img = cv::imread(ARGS_image_path);
1045+ 
1046+   mmdeploy::PoseDetector detector(mmdeploy::Model{ARGS_model_path}, mmdeploy::Device{FLAGS_device_name, 0});
10491047
1050-   // construct a detector instance
1051-   mmdeploy::Detector detector(mmdeploy::Model{ARGS_model}, mmdeploy::Device{FLAGS_device});
1052- 
1053-   // apply the detector, the result is an array-like class holding references to
1054-   // ` mmdeploy_detection_t ` , will be released automatically on destruction
1055-   mmdeploy::Detector::Result dets = detector.Apply(img);
1056- 
1057-   // visualize
1058-   utils::Visualize v;
1059-   auto sess = v.get_session(img);
1060-   int count = 0;
1061-   for (const mmdeploy_detection_t& det : dets) {
1062-     if (det.score > FLAGS_det_thr) {  // filter bboxes
1063-       sess.add_det(det.bbox, det.label_id, det.score, det.mask, count++);
1064-     }
1048+   mmdeploy::PoseDetector::Result result{0, 0, nullptr};
1049+ 
1050+   if (FLAGS_bbox_x == -1 || FLAGS_bbox_y == -1 || FLAGS_bbox_w == -1 || FLAGS_bbox_h == -1) {
1051+     result = detector.Apply(img);
1052+   } else {
1053+     // convert (x, y, w, h) -> (left, top, right, bottom)
1054+     mmdeploy::cxx::Rect rect;
1055+     rect.left = FLAGS_bbox_x;
1056+     rect.top = FLAGS_bbox_y;
1057+     rect.right = FLAGS_bbox_x + FLAGS_bbox_w;
1058+     rect.bottom = FLAGS_bbox_y + FLAGS_bbox_h;
1059+     result = detector.Apply(img, {rect});
10651060  }
10661061
1067-   if (!FLAGS_output.empty()) {
1068-     cv::imwrite(FLAGS_output, sess.get());
1062+   // Draw circles at detected keypoints
1063+   for (size_t i = 0; i < result[ 0] .length; ++i) {
1064+     cv::Point keypoint(result[ 0] .point[ i] .x, result[ 0] .point[ i] .y);
1065+     cv::circle(img, keypoint, 1, cv::Scalar(0, 255, 0), 2);  // Draw filled circle
10691066  }
10701067
1068+   // Save the output image
1069+   cv::imwrite("output_pose.png", img);
1070+ 
10711071  return 0;
10721072}
10731073``` 
0 commit comments