ужасная поза камеры arcore

Недавно я работал над 3D-сканированием в реальном времени и реконструкцией среды с помощью мобильного устройства, поэтому я решил проверить, как работает arcore. По сути, моя тема состоит в том, чтобы сбрасывать данные arcore с помощью своего C API, который используется для автономного тестирования позже на ПК.

Все, что мне нужно, - это встроенная камера, изображение и поза для каждого кадра. Ниже приводится моя функция дампа:

void DumpData(ArSession* session, ArFrame* frame){
  static const std::string g_dump_dir = "/sdcard/arcore_dump/";
  static bool has_config_dumped = false;
  static size_t g_frm_cnt = 0;
  float pose_array[16];
  uint8_t* input_pixels = nullptr;
  int length = 0;
  FILE* fp = nullptr;
  ArCamera* camera;
  ArImage* image = nullptr;
  const AImage* ndk_image = nullptr;
  ArTrackingState state;
  int64_t t_frm, t_img;
  ArFrame_acquireCamera(session, frame, &camera);
  ArCamera_getTrackingState(session, camera, &state);

  if(state == AR_TRACKING_STATE_TRACKING){
    ArFrame_acquireCameraImage(session, frame, &image);
    ArFrame_getTimestamp(session,frame, &t_frm);
    ArImage_getTimestamp(session, image, &t_img);
    LOGI("timestamp diff: %lf (ms)", (double)(t_frm - t_img)/1e6);
    ArImage_getNdkImage(image, &ndk_image);

    //dump camera configuration only once
    if(!has_config_dumped){
      float fx,fy,cx,cy;
      int image_width;
      int image_height;
      std::string config_path = g_dump_dir + "config";
      ArCameraIntrinsics* intrinsics;
      ArCameraIntrinsics_create(session, &intrinsics);
      ArCamera_getImageIntrinsics(session, camera, intrinsics);
      ArCameraIntrinsics_getFocalLength(session, intrinsics, &fx,&fy);
      ArCameraIntrinsics_getPrincipalPoint(session, intrinsics, &cx,&cy);
      ArCameraIntrinsics_getImageDimensions(session, intrinsics,
                                            &image_width, &image_height);
      fp = fopen(config_path.c_str(), "wb");
      if(fp != nullptr) {
        fwrite(&image_width, sizeof(image_width), 1, fp);
        fwrite(&image_height, sizeof(image_height), 1, fp);
        fwrite(&fx, sizeof(fx), 1, fp);
        fwrite(&fy, sizeof(fy), 1, fp);
        fwrite(&cx, sizeof(cx), 1, fp);
        fwrite(&cy, sizeof(cy), 1, fp);
        fclose(fp);
        has_config_dumped = true;
      }else
        LOGE("%s cannot be created!",config_path.c_str());
    }

    //dump pose and image data
    std::string file_path = g_dump_dir + std::to_string(g_frm_cnt) + ".frm";
    ArPose* ar_pose = nullptr;
    ArPose_create(session, nullptr, &ar_pose);
    ArCamera_getPose(session, camera, ar_pose);
    ArPose_getMatrix(session, ar_pose, pose_array);
    //ArCamera_getViewMatrix(session, camera, pose);
    AImage_getPlaneData(ndk_image, 0, &input_pixels, &length);
    fp = fopen(file_path.c_str(), "wb");
    if(fp != nullptr){
      fwrite(pose_array, sizeof(float), 16, fp);
      fwrite(input_pixels, sizeof(uint8_t), length, fp);
      fclose(fp);
    }else
      LOGE("%s cannot be created!",file_path.c_str() );
    ++g_frm_cnt;
    ArPose_destroy(ar_pose);
    ArImage_release(image);
  }
  ArCamera_release(camera);

}

После восстановления автономных данных на ПК я проверил линии эпипопара, но результаты были невероятно ужасными: введите здесь описание изображения Итак, есть ли ошибки в моей функции дампа? спасибо за просмотр!


person Finley    schedule 20.03.2020    source источник


Ответы (1)


Позиции ужасные в основном из-за неточной калибровки камеры и IMU. На устройствах Google Pixel калибровка более точная.

person Luboš V.    schedule 22.03.2020
comment
но почему рендеринг фиктивных объектов в среде с использованием arcore выглядит правдоподобно? Мой мобильный телефон - Mi 8 - person Finley; 24.03.2020
comment
Он использует якоря. Положение объекта определяется не координатами, а визуальным признаком. - person Luboš V.; 25.03.2020