Я недавно работаю над трехмерным сканированием в реальном времени и восстановлением среды с помощью мобильного устройства, поэтому я решил проверить, как работает arcore. По сути, мой поток состоит в том, чтобы выгружать данные дуги с помощью его C API , который позже используется для автономного тестирования на P C.
Все, что мне нужно, это внутренняя камера, изображение и поза для каждого кадра. Вот моя функция дампа:
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);
}
После восстановления автономных данных на P C я проверил эпипопарные линии , но результаты невероятно ужасны: Итак, есть ли ошибки в моей функции дампа? спасибо за просмотр!