【问题标题】:terrible camera pose of arcore可怕的arcore相机姿势
【发布时间】:2020-03-20 04:21:26
【问题描述】:

我最近正在使用移动设备进行实时 3D 扫描和环境重建,所以我决定测试 arcore 的性能。基本上,我的线程是用its C API 转储arcore 数据,用于稍后在PC 上进行离线测试。

我需要的只是每一帧的相机内在函数、图像和姿势。以下是我的转储函数:

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

}

在PC上恢复离线数据后,我检查了epipopar lines,但结果非常糟糕: 那么,我的转储函数中是否存在任何错误?感谢观看!

【问题讨论】:

    标签: c++ arcore 3d-reconstruction slam


    【解决方案1】:

    这些位置很糟糕,主要是因为相机和 IMU 校准不准确。在 Google Pixel 设备上,校准更加准确。

    【讨论】:

    • 但是为什么使用arcore在环境中渲染虚拟对象看起来很真实?我的手机是小米8
    • 它正在使用锚点。物体的位置不是由坐标定义的,而是由视觉特征定义的
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 2023-03-18
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多