endo_guide.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #include "endo_guide.h"
  2. #include "core/imgui_utility.hpp"
  3. #include "module/camera_augment_helper_v2.h"
  4. app_endo_guide::app_endo_guide(const create_config &_conf) {
  5. main_conf = _conf;
  6. auto conf = main_conf.ext_conf;
  7. // initialize object manager
  8. OBJ_SAVE(img_color, image_u8c3());
  9. OBJ_SAVE(img_out, image_ptr());
  10. // initialize sophiar
  11. sophiar_thread = std::make_unique<std::thread>([conf_path = LOAD_STR("sophiar_config")] {
  12. sophiar::run_sophiar(conf_path);
  13. });
  14. sophiar_conn = std::make_unique<sophiar_conn_type>();
  15. sophiar_start_var = LOAD_STR("sophiar_start_var");
  16. // initialize modules
  17. auto uvc_cam_conf = uvc_camera_ui::create_config{
  18. .img_name = img_color,
  19. .ctx = main_conf.asio_ctx,
  20. .stream = default_cuda_stream,
  21. };
  22. uvc_cam = std::make_unique<uvc_camera_ui>(uvc_cam_conf);
  23. auto bg_viewer_conf = image_viewer::create_config{
  24. .mode = VIEW_COLOR_ONLY, .flip_y = true,
  25. .stream = default_cuda_stream,
  26. };
  27. auto &bg_extra_conf = bg_viewer_conf.extra.color;
  28. bg_extra_conf.fmt = COLOR_RGB;
  29. bg_extra_conf.name = img_out;
  30. bg_viewer = std::make_unique<image_viewer>(bg_viewer_conf);
  31. auto saver_conf = image_saver::create_config{.ctx = main_conf.asio_ctx};
  32. saver_conf.img_list.emplace_back("Image", img_color);
  33. out_saver = std::make_unique<image_saver>(saver_conf);
  34. auto calib_conf = camera_calibrator::create_config{
  35. .img_name = img_color,
  36. .board_type = camera_calibrator::CALIB_CHESS,
  37. .pattern_size = cv::Size(11, 8), .corner_distance = 5,
  38. .stream = default_cuda_stream, .ctx = main_conf.asio_ctx,
  39. .cb_func = [this](const auto &ret) {
  40. aug_helper->set_camera_info(ret.cam_in);
  41. aug_helper->get_camera_helper()
  42. ->set_fixed_transform_latency(ret.time_offset);
  43. },
  44. .sophiar_conn = sophiar_conn.get(),
  45. .ref_transform_var = LOAD_STR("camera_ref_transform_var"),
  46. .result_transform_var = LOAD_STR("camera_calib_transform_var"),
  47. };
  48. cam_calib = std::make_unique<camera_calibrator>(calib_conf);
  49. auto aug_list_v1 = augment_manager::item_list_from_yaml(LOAD_LIST("augment_list"));
  50. auto aug_list = augment_manager_v2::item_list_from_v1(aug_list_v1, extra_name);
  51. auto aug_conf = augment_manager_v2::create_config{
  52. .sophiar_conn = sophiar_conn.get(),
  53. .stream = default_cuda_stream,
  54. };
  55. std::copy(aug_list.begin(), aug_list.end(), std::back_inserter(aug_conf.item_list));
  56. aug_manager = std::make_unique<augment_manager_v2>(aug_conf);
  57. auto helper_conf = image_augment_helper_v2::create_config{
  58. .img_name = img_color, .mask_name = invalid_obj_name,
  59. .out_name = img_out, .img_flip_y = false,
  60. .manager = aug_manager.get(), .stream = default_cuda_stream,
  61. .ctx = main_conf.asio_ctx,
  62. .sophiar_conn = sophiar_conn.get(),
  63. .transform_var = LOAD_STR("camera_transform_var"),
  64. };
  65. aug_helper = std::make_unique<image_augment_helper_v2>(helper_conf);
  66. aug_helper->post_render_sig.connect([this] { cam_calib->render(); });
  67. auto monitor_conf = sophiar_monitor::create_config{
  68. .item_list = sophiar_monitor::item_list_from_yaml(LOAD_LIST("monitor")),
  69. .sophiar_conn = sophiar_conn.get(),
  70. };
  71. monitor = std::make_unique<sophiar_monitor>(monitor_conf);
  72. // auto sim_info = camera_calibrator::simulate_info_type{
  73. // .data_path = "/home/tpx/project/DepthGuide/cmake-build-debug/calib_data_10.96.txt",
  74. // .img_size = cv::Size(1920, 1080),
  75. // };
  76. // cam_calib->simulate_process(sim_info);
  77. }
  78. void app_endo_guide::show_ui() {
  79. if (ImGui::Begin("Endo Guide Control")) {
  80. ImGui::PushItemWidth(200);
  81. if (ImGui::CollapsingHeader("Camera")) {
  82. auto id_guard = imgui_id_guard("camera");
  83. uvc_cam->show();
  84. }
  85. if (ImGui::CollapsingHeader("Tracker")) {
  86. if (ImGui::Button("Start")) {
  87. start_tracking();
  88. }
  89. monitor->show();
  90. {
  91. ImGui::SeparatorText("Scene");
  92. auto id_guard = imgui_id_guard("augment_scene");
  93. aug_manager->show();
  94. }
  95. }
  96. if (ImGui::CollapsingHeader("Calibration")) {
  97. auto id_guard = imgui_id_guard("calibration");
  98. cam_calib->show();
  99. }
  100. if (ImGui::CollapsingHeader("Debug")) {
  101. if (ImGui::TreeNode("Image Saver")) {
  102. out_saver->show();
  103. ImGui::TreePop();
  104. }
  105. }
  106. }
  107. ImGui::End();
  108. }
  109. void app_endo_guide::render_background() {
  110. bg_viewer->render();
  111. }
  112. void app_endo_guide::start_tracking() {
  113. // sophiar_conn->start_object(sophiar_start_var);
  114. // work in another thread to prevent blocking
  115. auto t = std::thread([this] {
  116. auto conn = sophiar::local_connection();
  117. conn.start_object(sophiar_start_var);
  118. });
  119. t.detach();
  120. }
  121. app_endo_guide::~app_endo_guide() {
  122. // sophiar
  123. sophiar::stop_sophiar();
  124. sophiar_thread->join();
  125. }