Коррекция перспективы ARKit

Я работаю над проектом с ARKit и пытаюсь сделать перспективную коррекцию ARFrame.capturedImage, чтобы сориентировать лист бумаги, лежащий на обнаруженной плоскости, чтобы я мог передать это в модель CoreML, которая ожидает, что изображения будут взяты напрямую. накладные расходы.

ARKit дает мне ориентацию устройства относительно плоскости (ARCamera.transform, ARCamera.eulerAngles и ARCamera.projectionMatrix выглядят многообещающе).

Итак, у меня есть ориентация камеры (и я знаю, что плоскость горизонтальна, так как это все, что ARKit определяет прямо сейчас).. но я не могу понять, как создать GLKMatrix4, который будет выполнять правильную коррекцию перспективы.

Первоначально я думал, что это будет так же просто, как преобразование, обратное ARCamera.projectionMatrix, но, похоже, это вообще не работает; Я не совсем уверен, что описывает эта матрица. Кажется, она не сильно меняется в зависимости от ориентации устройства.

Я пытался создать свою собственную матрицу, используя GLKMatrix4Rotate и крен/тангаж/рысканье, но это не сработало. Я даже не смог заставить ее работать с одной осью вращения.

Я нашел GLKMatrix4MakePerspective, GLKMatrix4MakeOrtho и GLKMatrix4MakeFrustum, которые, похоже, выполняют преобразования перспективы, но я не могу понять, как взять имеющуюся у меня информацию и преобразовать ее во входные данные этих функций, чтобы выполнить правильное преобразование перспективы.

Редактировать В качестве примера, чтобы лучше объяснить, что я пытаюсь сделать, я использовал инструмент Perspective Warp в Photoshop для преобразования примерного изображения; что я хочу знать, так это то, как придумать матрицу, которая будет выполнять подобное преобразование, учитывая информацию, которую я имею о сцене.

введите описание изображения здесь


person Brad Dwyer    schedule 03.08.2017    source источник


Ответы (2)



Я решил использовать перспективное преобразование OpenCV. (https://docs.opencv.org/trunk/da/d6e/tutorial_py_geometric_transformations.html,https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html#getperspectivetransform )

Если вы можете получить углы своей бумаги в сцене (например, с помощью ARReferenceImage и проецировать их в 2D), возьмите их. В противном случае вы можете попытаться обнаружить углы напрямую через OpenCV (см. ) из UIImage, взятых из sceneView.snapshot() с sceneView типа ARSceneView. В этом последнем случае я предлагаю вам сначала выполнить бинаризацию и изменить переменную MAX_CORNERS во фрагменте по ссылке выше на 4 (4 угла вашей статьи).

Затем создайте новый cv::Mat с шириной и высотой по вашему выбору, соблюдая пропорцию ширины и высоты вашей бумаги, и выполните преобразование перспективы. Руководство по этому последнему абзацу см. в разделе «Коррекция перспективы с помощью гомографии» по этой ссылке: https://www.learnopencv.com/homography-examples-using-opencv-python-c/#download. Кратко: вы просите opencv найти подходящее преобразование для проецирования ваших предполагаемых бумажных точек на идеально прямоугольную плоскость (ваш новый cv::Mat)

person Mattia Personaggio Uno Ducci    schedule 03.07.2019