Использование матрицы преобразования перспективы opencv 3.0 findHomography для преобразований CALayer CATransform3D

В настоящее время я экспериментирую с opencv на платформе iOS. Идея состоит в том, чтобы захватить видеопоток, а затем найти изображение в этом потоке. Я правильно определяю изображение и хотел бы использовать гомографию между известным изображением и изображением на экране для преобразования CALayer, который содержит рамку для изображения (чтобы рамка рисовалась вокруг изображения).

Я рассчитал гомографию между двумя изображениями, используя findHomography. Я убедился, что эта гомография действительна, поскольку использование перспективыTransform для рисования границы вокруг изображения в cv::Mat дает мне идеальное выравнивание при масштабировании, перемещении и вращении камеры в 3D. Я хотел бы использовать гомографию для преобразования CALayer (Core Animation на iOS), чтобы нарисовать HUD поверх захваченного изображения. Это будет использоваться для пометки найденного изображения в канале камеры.

Я попытался использовать ответ Томми из Преобразование матрицы перспективы findHomography OpenCV в iOS CATransform3D, но это не сработало. На экране не отображалось изображение.

Я использую собственный подкласс CALayer, который просто рисует прямоугольник в своем фрейме. Я проверил это без преобразования, и это работает. Однако, когда я применяю сгенерированный CATransformation3D, на экране ничего не рисуется.

Я пытался отладить это, используя ответ Тома из Как получить вращение, перевод, сдвиг из матрицы гомографии 3x3 в C#, чтобы вычислить статистику гомографии, но это кажется странным: они дают вращение с шагом pi/2 и огромными масштабами величина. В то же время, перспективаTransform, кажется, отлично использует найденную матрицу гомографии.

Есть ли какое-то изменение в opencv 3.0, из-за которого ответы на два вышеуказанных вопроса перестали работать? Любая помощь приветствуется!


person Max Snijders    schedule 21.08.2015    source источник
comment
Гомография 3x3 — это преобразование 2D в плоскость в плоскость. Согласно thinkandbuild.it/ CATransform3D представляет собой трехмерное преобразование и, следовательно, использует матрицу преобразования 4x4. Вы пытались добавить строку [0, 0, 1, 0] + строку для отсутствующего измерения?   -  person Micka    schedule 31.08.2015
comment
Я сделал. Однако не сработало. Использование свойства scale.x с кодировкой ключ-значение в CATransform3D дает сильно меняющиеся значения, даже когда камера едва движется и когда openCV правильно определяет изображение.   -  person Max Snijders    schedule 03.09.2015
comment
Макс, ты когда-нибудь решал эту проблему? Кажется, я иду по тому же пути, что и ты. Я могу использовать все функции OpenCV для создания гомографии и идеального перевода изображений (кадров камеры). Но всякий раз, когда я пытаюсь применить CATransform3D к виду с камеры, я получаю те же неправильные результаты, что и вы.   -  person VTPete    schedule 22.04.2019